我听到的几个开发者最近说,他们只是投票材料(数据库、文件等)。 确定当事情发生了变化并运行一个任务,诸如进口。

我真的反对这种想法和感觉,利用可用的技术,例如 远程处理, WCF, 等等。将远远超过查询。

然而,我想以识别的原因,为什么其他人喜欢一个办法越过其他更重要的是,我怎能说服其他人,投票是错误的,在这一天和年龄?

有帮助吗?

解决方案

投票不是"错误的",因为这样的。

这在很大程度上取决于它是如何执行和为什么目的。如果你真的关心immedatly通知的改变,这是非常有效。你的代码坐在紧循环,不断地投票(要求)的资源是否已经改变/更新。这意味着你通知你可以尽快被这东西是不同的。但是,你的代码不是做其他事情并没有开销方面的许多许多人呼吁的对象的问题。

如果你不太关心立即通知您可以增加之间的时间间隔调查,这也可以工作,但是选择正确的时间间隔可能是困难的。太长了你可能会错过的关键变化、太短期和你回到问题的第一种方法。

替代方案,例如中断或消息等。可以提供一个更好的妥协,在这些情况。你是通知改变,尽快实际上是可能的,但这种延迟是不是你的控制,这取决于组件tself是及时的有关经变化的状态。

什么是"错误的"与投票?

  • 它可以是资源占用了.
  • 它可以限制(特别是如果你拥有许多事情你要知道约/poll).
  • 它能够矫枉过正。

但是...

  • 它不是固有的错误的。
  • 它可以非常有效。
  • 这是很简单的。

其他提示

有两个原因为什么投票可能会被认为是糟糕的原则。

  1. 这是浪费资源。这是非常可能的是,你会检查的变化,同时不改变已经发生。CPU循环/宽带花在这个行动不会导致变化,因此可以更好花在别的东西。

  2. 投票是在一定的时间间隔。这意味着你不会知道发生了改变,直到下一时间的间隔时间已经过去了。

它将更好地得到通知的变化。这样你不投票的变化,还没有发生,你会知道的变化尽快收到该通知。

例的东西,使用投票,在这一天和年龄:

  • 电子邮件的客户调查新的消息(即使IMAP)。
  • RSS读者调查的变化来源。
  • 搜索引擎查询变化的网页,他们的索引。
  • 计算器的用户调查的新问题,通过点击"刷新";-)
  • Bittorrent客户调查跟踪器(和彼此,我认为,与睾酮)的变化群。
  • 自旋锁在多核心系统可以最有效率同步之间的核心,在情况下的拖延是过短,为那里是时间安排另外一个线程上的这个核心之前,其他核心做什么我们在等待。

有时根本不是任意的方式得到异步通知:例如替换RSS与推动的系统,服务器就得知道每个人读的饲料和一种方式接触他们。这是一个邮件列表-精确的事情之一RSS的目的是要避免的。因此,事实,即我的大多数例子是网络应用程序,在那里,这是最有可能是一个问题。

其他时间,查询的便宜足够的工作即使有异步通知。

对于一个当地的文件、通知的变化可能是更好的选择原则。例如,可以(可能)防止磁盘转向如果你永远戳它,虽然后再OS可能缓存。如果你投票的每一个第二个文件,该文件只是改变一小时一次,你可能会不必要地占领0.001%(或者)的计算机处理能力。这听起来很小,但会发生什么情况时有100 000名文件需要调查?

在实践中,尽管开销是有可能可以忽略不计任何你这样做,使得它很难让人兴奋不断变化的代码目前的工作。最好的事情是要注意的具体问题投票的原因在系统上你想要的变化-如果你发现任何随后提出的那些,而不是试图使一般参数对所有查询。如果你找不到任,那么你就不能解决什么不是破碎的...

轮询是容易做到的,很容易,其容易,因为任何程序代码。不投票意味着你进入异步编程,这是不一样脑残容易的世界,甚至可能成为时常挑战。

此外,与在任何系统中的一切,阻力更小的路径通常是更常见的拍摄,所以总是会有使用轮询,甚至是优秀的程序员的程序员,因为有时候没有必要的事情异步模式复杂化。

一,我一直茁壮成长,以避免投票,但有时我做的投票反正,尤其是当异步处理的实际收益是不是很大,对一些小型的本地数据行事时,如(当然你得有点快,但用户不会注意到在这样的情况下,差)。所以有必要提供一种既方法IMHO。

客户端轮询不能扩展以及服务器的通知。想象一下,成千上万的客户的要求服务器“任何新的数据?”每5秒。现在想象一下服务器保持客户端列表通知新的数据。服务器通知更好地伸缩。

我认为人们应该认识到,在大多数情况下,在一定程度上有投票正在做的,即使是在事件或中断驱动的情况下,但你从实际的代码做轮询隔离。真的,这是最理想的情况......从implementaion孤立自己,只是处理该事件。即使你必须自己实现轮询,写得了代码,以便它的隔离,结果处理独立实施的。

其简单 - 轮询是坏的 - 效率低下,浪费资源等方面始终处于了某种形式连接的是反正监测某种类型的事件,即使“投票”未选择

那么,为什么去加倍努力,把更多的投票到位。

回调是最好的选择 - 只需要担心回调绑定在你的当前进程。底层,有轮询正在进行地看到,该连接仍然存在无论如何。

如果你不停地打电话/振铃的女朋友,畲族从未答案,那么为什么一直在打?刚刚离开的消息,等到她回叫';)

我使用轮询偶尔会在某些情况下(例如,在一场比赛中,我会查询键盘状态每帧),但从来没有在一个循环,不仅投票,而我会做轮询作为检查(具有资源X改变了吗?如果是的话,做一些事情,否则处理别的事情以后再次检查)。虽然通常来说,我避免轮询支持异步通知。

是,我不花资源的原因(CPU时间,等等)等一些事情发生(尤其是如果这些资源能加速这一事情在第一时间发生的事情)。在这里我使用轮询的情况下,我不坐空闲等待,我用的是其他地方的资源,所以这是一个非问题(对我来说,至少)。

如果您是轮询更改到一个文件,那么我同意,你应该使用文件系统通知可用于当发生这种情况,这在大多数操作系统都提供了。

在数据库中,你可以触发更新/插入,然后打电话给你的外部代码做一些事情。然而,它可能只是你没有即时行动的要求。例如,你可能只需要在15分钟内从数据库中获得的数据到数据库B不同的网络上。数据库B可能无法从数据库A访问,所以你最终从做轮询,或者作为一个独立的程序跑近,数据库B。

此外,轮询是编程很简单的事情。它往往是,当时间的限制是短期做了第一步的实现,因为它工作得很好,它仍然存在。

有关投票的事情是,它的作品!其可靠和简单地实现。

池的成本可能会很高 - 如果扫描数据库更改每分钟的时候有你消耗大量资源的一个非常小的结果,每天只有两个变化

但是任何通知technoligy的问题是,他们更复杂的实现,而不是只有他们是不可靠的,但(这是一个很大的BUT)时,他们没有工作,你不能轻易分辨。

所以,如果你做的下降轮询其他一些technoligy确保它是可用的平均程序员和超是可靠的。

我在这里看到很多答案,但我认为最简单的答案是答案它的自我:

由于(通常)更简单的代码轮询循环比,使回调的基础设施。

然后,你如果事实证明这证明是一个瓶颈以后是很容易理解和重新设计/重构到别的东西更简单的代码。

这不是回答你的问题。但实际上,特别是在这个"天和年龄"在处理器周期都便宜,而且带宽大,投票实际上是一个很好的解决方案的一些任务。

好处是:

  • 便宜
  • 可靠的
  • 测试
  • 灵活

我同意避免轮询是一个良策。然而,在参考罗伯特的帖子,我会说,投票的简单可以让它在这里提到的问题都没有这么大的问题情况下,更好的方法,因为异步方式往往是相当少的可读性和难以维持,更不用说在蠕变其实施的错误。

和一切,这取决于。大高交易系统,我的工作目前正在使用与SQL的通知(SQL Server中加载的DLL,它由来自某些表上的触发器扩展名为SP该DLL然后通知其他应用程序,有工作要做)。

但是我们离这个活动,因为我们几乎可以保证,将有工作,不断做。因此,为了降低复杂性,实际上加快了一点东西,该应用程序将处理自己的工作,并立即再次轮询DB的新工作。如果有没有一个小的时间间隔后它会再试。

这似乎工作更快,要简单得多。然而,这是低得多的体积不使用此方法的速度增加受益的应用程序的另一部分 - 除非轮询间隔非常小,这导致性能问题。因此,我们把它当作是这一部分。因此,它是一个很好的事情时,这是适当的,但每个人的需求是不同的。

下面是推拉的相对优点的一个很好的总结:   https://stpeter.im /index.php/2007/12/14/push-and-pull-in-application-architectures/

我希望能进一步总结成这个答案,但有些东西是最好的左删节。

当思考SQL询,后在当天的维生素b6你用能够创建记录的使用的消关键词,这是一种早期的异步"听"。

我总是寻找一种方法的使用的一个事件驱动的执行之前的投票。如果做不到这一手册实施的以下任何可能会帮助:

  • sql服务的经纪人/依赖类
  • 一样的队列技术(RabbitMQ或类似的)
  • UDP广播-有趣的技术,可以 将建立与多个节点的听众。不可能总是在一些网工作。

其中一些可能需要稍微重新设计的项目,但在一个企业的世界可能是更好的路要走,而不是询服务。

与异步/消息通常是更好的最响应Agreee。我绝对罗伯特·古尔德的答案达成一致。但我想补充一点。

一个另外的是,可以轮询一举两得一石。在一个特定的使用情况中,一个项目,我曾参与使用的数据库,但轮询之间的消息队列从应用服务器向所述数据库中的一个。因为从应用服务器到数据库网络是偶尔下来,投票被另外用于通知网络问题的应用程序。

在最后,用什么做的最有意义的的使用情况时考虑到规模化的能力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top