你有没有想过一些项目是如何从无到有的,并猜测开发过程中肯定发生过的曲折?我在这里提出了一个假设的情况,它的灵感来自于过去发生的一系列事情,但这并不能描述任何一种产品。至少是故意的。
如果你是那种一边阅读问题描述,一边在头脑中尝试设计自己的解决方案的人,这可能是一个有趣的尝试。看看在你不得不改变策略以适应不断变化的需求之前,你还能坚持原来的方法多久。不要跳到最后来作弊。假设整个事情是在几个月的时间里有机地发展起来的,客户/用户几乎没有(如果有的话)向前看。
这个想法的提示语基本上是这样的:有人走过来对我说,他们对后端的工作更感兴趣。比方说,我们已经过了我问他们到目前为止你都试了些什么的时候,我要给他们布置一项任务。他们要求它是现实的,所以他们可能会为有一天面对现实世界做好准备。所以,这就是后来的情况。
好的,不如你写一些带有主机名和端口的东西,并与它建立(TCP)连接,看看它是否启动了?只要说是涨是跌就行了。我们将使用它来进行一些愚蠢的主机监控工作,这将帮助您入门。
哦,还有,别被卡住了。大约30秒后就放弃。主人可能已经倒下了,否则你会在那里坐很长时间。
现在,您是否了解了如何执行DNS查询才能将主机名转换为IP地址?那需要多长时间?这可能很快,但绝不是零。总是会有一些延误。你能用仪器测量一下吗?这样我们就能知道你在DNS部分花了多长时间?在说“向上”或“向下”之前,先说一些类似DNS的东西,延迟15毫秒。
明白了吗?好的。那连接本身呢?这也不会马上结束。如果成功了,你能说出花了多长时间吗?你可以这样说,而不是向上。如果它是向下的,仍然只说向下。
接下来,多个端口怎么样?我可以为您提供此主机的多个端口,然后您将检查所有端口吗?你可以按顺序做。就目前而言。
这样行得通吗?现在我们把它们平行进行怎么样?那样的话我们会更快得到结果。现在不要担心并发的限制。它们是我们的机器,所以如果我们有效地对它们进行端口扫描也没问题。
好的,好的,现在,好的,我想检查多个主机。您可以串行处理单个主机,然后并行处理该主机的端口,就像您现在正在做的那样。因此,请检查主机A的所有端口,然后检查主机B的端口,依此类推。哦,对于每台主机来说,它们可能不是相同的端口。
在那之后,对,你猜对了,你能让它并行做所有的主机,所有的端口吗?那真的会让我们大吃一惊的。
准备好下一步了吗?我可以让您持久化并作为服务运行,这样您就可以拥有缓存了吗?比如,我可以要求你检查一大堆东西吗?如果你已经有了这些答案,你就不需要尝试新的连接了吗?您可以从我们将为所有项目指定的单个秒数设置缓存间隔。(我不会尝试让您跟踪不同缓存项生存期的请求。现在还不行。呵呵。)。
记住挂钟可能会倒退,所以使用单调的时钟可以让东西老化。
是的,现在,有时我们确实需要一直打卡到主机,而不使用缓存。我们是否可以在请求中设置一个字段,说明立即按需执行此操作,并且将忽略缓存?之后一定要更新缓存,因为,嘿,我们已经付钱了,我们最好还是保留数据,对吧?
太棒了!当我们执行按需请求时,如果我们为该目标缓存的内容与按需检查发现的内容不匹配,我们是否可以记录一些内容?假设它早些时候被轮询,并被缓存为关闭,但按需请求发现它已打开。这很值得注意,对吧?
非常出色。所以..。数据。人们喜欢数据。我们是否可以跟踪我们为给定主机/端口提供了多少按需请求?它可以暂时存储在内存中,所以如果您的服务重新启动,这些数字就会消失。
下一次,是的,你知道会这样。我们可以让统计数据在您的服务重新启动时保持不变,这样当您推出新版本时,它就不会全部归零了吗?
前N位的按需目标排行榜怎么样,或者羞耻堂之类的?我们想看看谁一直以来都是最常使用它的人。
你猜怎么着?在所有榜单上的一些人都是旧新闻了。让我们设法只给出过去X天的前N个。也许我们想要过去30天最重要的10个目标。这类事情。
还在听吗?如果你是在脑子里设计的,你是怎么做的?您是否始终将指标放在您的流程中?你是不是把它们运到别的地方去了?如果是这样的话,它是在哪里从一个转到另一个的呢?是不是当它从昙花一现变成了有状态的时候?
解算器怎么样?您是从gethostbyname开始,还是坚持使用C库的getaddrinfo()?或者,你是不是踢了平底船,然后去了别的地方?您注意到getaddrinfo块了吗?当解析器停机或速度变慢时,您将如何处理并行化,而不会被困在它后面?
您是想尝试愉快的眼球支持,还是一次只获取给定目标的多个DNS RR?
看到所有那些需要担心的疯狂事情了吗?我想我真的很想和一些有意愿的学生一起做类似的事情。我会让他们沿着这条路去做一些有趣的事情(比如监测活跃度),然后向他们扔足够多的曲线球,迫使他们遇到并解决那些类型的问题。我会让他们去做一些有趣的事情(比如监测活跃度),然后向他们投掷足够的曲线球,迫使他们遇到并解决这类问题。