2017-01-03 47 views
0

自从一周以来,我一直在想这个,但是我没有想到让我信服的任何东西。Apache Ignite - 在群集中排定

我有一个小群集在所有节点上运行带泽西岛的Jetty(它们都是相同的)。请求在节点上是均衡的,并且所有节点都是“无状态的”。

用户数据使用Jetty嵌入在JVM中的Apache Ignite上进行分区,因此可供任何节点访问。

到目前为止,所有对这些数据执行的操作都是由REST请求触发的,并由节点管理,请求偶然发现。但现在需求已经改变。示例如下:

用户执行特定操作(提供虚拟物品)后,其他随机用户很少会收到有关兑换此商品的机会的通知。在他们中的任何一方采取行动(在发布后的限定时间内),他们将拥有它。 这里的问题是:如果没有用户在给定时间内兑换商品,我想挑选几个新用户并通知他们。

这将需要安排,我只能看到两种解决方案:

  • 附表那个通知的前几个用户节点上的事件。 (如果节点失效或重新加载,则不可靠)

  • 来自所有节点的池存储了触发到期事件所需的数据的分布式集合。然后运行那些过期的。 (当这个系列增长时看起来效率较低的解决方案)

    • 两者的hibrid;事件存储在分布式集合中,并且预定可能很好。如果节点不失败,将运行并删除收集条目。集合的缓慢迭代将检查是否有过期的事件并且尚未被删除。 (它看起来可能难以调试和预测的解决方案)

除了我已阅读DelayedQueue执行和不看一个有效的系统来管理计划任务量很大。

我会承认我被卡住了,我需要一个关于如何在集群基础上安排事件的建议,以确保它们将被调用,因为它们将抵抗节点故障。

回答

0

我想你可以创建一个集群单例(https://apacheignite.readme.io/docs/cluster-singletons),它将负责调度。这将自动处理崩溃情况下的故障转移。如果存在任何状态(例如关于通知的用户的信息,上次安排作业的时间戳等),则可以将其保存在缓存中。