Hazelcast-没有收听者的队列,或向许多订阅者之一广播

时间:2019-05-07 16:43:48

标签: java hazelcast

我有一个体系结构,其中有一组构成我的平台的“守护程序”进程。这些守护进程是完整的Hazelcast成员,并且是应用程序中所有数据的数据存储。实际的业务逻辑与守护程序分离,并驻留在大量的微服务样式组件中,这些组件物理上位于同一服务器或不同机器(vm,容器等)上。这些服务可以修改数据存储中的数据并从守护程序订阅数据存储中的事件,但是该模型实际上是完全不同的,并且是从Hazelcast的地图视图中抽象出来的,因此我的事件不像侦听地图修改那样简单,而是在生成多个地图时生成以某些方式进行了修改。服务客户端(Hazelcast lite成员)定义了他们想要收听的事件。问题是,每种服务组件的多个实例(任意数量)可能正在运行,我只希望一个实例(任意一个)来处理每个事件(即循环或负载平衡)。

我当前的解决方案是使用Hazelcast队列。守护程序监听地图上的事件,并根据这些地图决定何时触发事件。密钥所有者的守护程序是将触发事件的守护程序,因此该事件仅在一个位置触发。我将此事件推送到队列,此事件的侦听器的每个实例都连接到该队列。因此,到达事件的人首先对其进行处理。

例如,我有一个名为IncomingBondPrices的数据源微服务,该服务将价格放入守护程序数据存储中。我有10个单独的名为priceProcessor的微服务的实例。当价格达到某个阈值时,守护程序将触发一个事件(我们将其称为“ PriceThresholdReached”)。我希望priceProcessor的10个实例中只有一个能够处理每个事件,因此,如果我以成百上千的价格进行流式传输,则在我的priceProcessor实例之间分配处理事件的负载。

我担心的是,如果没有消费者,会发生什么?我找不到任何方法来计算hazelcast队列中的消费者数量。该系统是完全动态的,服务会启动并将其感兴趣的事件的定义发送到守护程序。任何给定服务的1、2、20或100个实例都可能启动,并且它们可能都已关闭,并且该事件不再有任何订户。如果当前没有给定事件的订阅者,我想销毁队列,而不向其推送任何事件。如果没有订阅者,我不希望事件排队...

我该如何进行管理?我唯一能想到的方法是在守护程序中为每种事件类型保留一个订阅者计数,并在该事件降至0时销毁队列。但是我担心的是,如果没有正常关机,服务很可能会被杀死。将没有机会明确告诉守护程序他们不再监听。要解决此问题,我需要在Hazlecast发现某个成员已断开连接时明确检查所有成员是否仍在活动或订阅事件,然后跟踪该成员的所有订阅是否结束。有一个更好的方法吗?似乎过于复杂。理想情况下,我希望以某种方式在队列上找到在给定时间有多少当前成员正在队列上运行take(),如果该值为0并且队列上没有数据,则销毁它。 >

谢谢, 特洛伊。

1 个答案:

答案 0 :(得分:0)

我可以建议您使用名称“ registerConsumers”创建专用的ISet(或IMap)。每个使用者都将其id写入集合,并在关闭钩子上将其删除。 生产者最初检查该集合并注册要更新的ItemListener。问题是,如果听众的过程在没有好运的情况下失败了,该怎么办?希望实现负载平衡-将启动一个新实例,您将看到一个新实例。如果使用IMap,则消费者可以定期更新其时间(以地图的值表示),而生产者则定期检查上一次更新并删除没有更新时间的人。这样,如果您发现没有使用方,则只需将数据持久保存在另一个存储中,等待可用的使用方。为什么销毁队列-最终必须一次使用一个消耗微服务。

相关问题