|
1
4
对于这样的问题,他们发明了消息队列。想象一下当集群应用程序都监听消息队列(集群本身:-)时的情况。在某个时间点,一个实例获得下载外部资源的初始命令。如果成功,则实例刷新消息,并在稍后的执行时间(等于“运行时”+“间隔”)中发布另一条消息。但如果实例在处理过程中死亡,那就不是问题了。消息在队列中回滚(超时后),其他一些实例可以接收它。一点事务,一点消息队列 我在世界的爪哇EE方面,所以可以帮助您编码细节 |
|
|
2
1
我曾经用你的解决方案3实现过类似的东西。
创建一个名为
然后在每个间隔内,应用程序的所有实例都将:
这样做有两个好处:
|
|
|
3
1
有些要求你可能知道,但没有在问题中描述,使给出一个明智的答案具有挑战性。其中一些问题是:
第一步是回答如何安排周期性任务的运行。其中一个选项是windows计划的任务,但它本身并不高可用性,但可以解决这个问题。如果您使用的是SQL Server,另一种选择是使用SQL Server代理作为计划程序,因为它将作为SQL Server的一部分进行故障转移。 下一步要确定的是如何调用wcf应用程序。最简单的选择是触发作业,通过nlb ip地址调用wcf服务。如果数据库服务器(或该区域中的其他服务器)正在调用应用程序区域(当然,总会有诸如msdtc之类的异常),则可以认为这是no no。 另一个选择是使用队列模型。在大多数情况下,这是最可靠的。例如,SQL Server代理可以执行存储过程以在队列表中输入记录。然后,在每个应用服务器上,服务可以轮询以查找要处理的排队记录。对队列中记录的访问将由数据库序列化,以便中的第一个服务器运行该作业(并且该作业只运行一次)。
根据此答案中开头问题的答案,您可能需要添加更多的错误处理。如果外部资源的检索通常很短,您可能只需要使用
如果长时间保持数据库锁是不可行的,那么您可以更改逻辑并向服务添加一些监视。现在,当一个作业开始处理时,它的状态将从queued更改为running,正在处理该记录的服务器将在该记录上更新。可以创建某种服务状态表,每个服务实例每次轮询时都会更新当前时间。这将允许群集中的其他服务重新处理显示为正在运行的作业,但它们本应在其上运行的服务在一定时间内未“签入”。 这种方法也有局限性:如果任务实际完成了,但不知何故数据库连接丢失了,该作业可能会再次运行。当然,我不认为将原子数据库操作与其他非事务性资源(如web请求、文件系统)相结合的问题会很容易解决。我假设您正在编写一个文件或其他东西——如果外部内容也被放入数据库中,那么一个事务将保证所有内容都是一致的。 |
|
|
4
1
从简单的角度来看,最快/最简单的方法是“循环”集群,以便为每个请求选择一台机器(由集群管理服务或其他类似服务)来处理请求。实际的客户机请求不会直接转到处理它的计算机;而是指向一个端点,该端点充当代理,根据可用性和负载将传入的请求分发给计算机。引用下面引用的链接,
至于您的应用程序是“主动”的,这个要求不包括在这个等式中,因为无论是“主动”还是“被动”,应用程序仍然向您的服务器发出请求。 商业负载平衡器用于服务http样式的请求,因此这可能值得研究,但是使用w2k8的负载平衡功能,您最好利用这些功能。 有关如何在Win2K8中配置它的详细信息,请参阅 this 文章。 this article 更具技术性,并专注于将nlb与exchange结合使用,但原则仍应适用于您的情况。 see here 对于NLB设置和配置的另一个详细介绍。 如果失败,您可以通过在serverfault上搜索/发布得到很好的服务,因为您的应用程序代码没有(也不应该)严格意识到nlb甚至存在。 编辑:添加了另一个链接。 编辑(第二篇):OP修正了我在“主动”和“被动”概念中的错误结论。对此,我的回答与我最初的答案非常相似,只是“active”服务(由于您使用的是wcf,很容易成为windows服务)可以分为两部分:实际处理部分和管理部分。管理部分将在单个服务器上运行,并充当执行实际处理的其他服务器的循环负载平衡器。它比最初的场景稍微复杂一些,但我相信它将提供很大的灵活性,并在处理逻辑和管理逻辑之间提供一个干净的分离。 |
|
|
5
0
在某些情况下,人们会发现让3台机器执行所有请求,然后在最后比较结果,以确保结果绝对正确,并且在处理过程中没有硬件故障导致任何问题。这就是他们在飞机上做的事。 在其他时候,你可以忍受一个坏结果和一个小的停机时间切换到一个新的服务,但只是希望下一个是好的。在这种情况下,3号解决方案和一个心跳监视器是一个很好的设置。 其他时候,人们只需要收到一条短信,通知他们的服务已关闭,应用程序将只使用一些过时的数据,直到您手动执行某种故障转移。 就你而言,我认为后者对你可能更有用。既然您不能真正依赖另一端的服务,那么在这种情况下,您仍然需要想出一个解决方案。归还过时的数据可能对你有好处,但可能不是。很抱歉不得不说:这要看情况而定。 |
|
|
6
0
zookeeper是分布式锁的一个很好的用例。ZooKeeper有z节点,它们类似于包含数据的目录。 即使是netflix的馆长也已经做了很多菜谱并在使用。比如:领导人选举,分配锁等等。 我想我们的客户是C的动物园管理员。你一定要试试这个选择。第三选择 |