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

标签 java hazelcast

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

我当前的解决方案是使用 Hazelcast 队列。守护进程监听 map 上的事件并根据这些 map 决定何时触发事件。作为 key 所有者的守护进程将触发该事件,以便该事件仅在一处触发。我将此事件推送到队列中,该事件的监听器的每个实例都连接到该队列。因此,无论谁到达该事件,都首先处理该事件。

例如,我有一个名为 IncomingBondPrices 的数据源微服务,它将价格放入守护程序数据存储区。我有 10 个名为 PriceProcessor 的单独微服务实例。当价格达到某个阈值时,守护进程会触发一个事件(我们称之为“PriceThresholdReached”)。我希望 PriceProcessor 的 10 个实例中只有一个来处理每个事件,因此,如果我流式传输数百或数千个价格,则处理事件的负载将分散到我的 PriceProcessor 实例中。

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

我该如何处理这个问题?我能想到的唯一方法是在守护进程中记录每种事件类型的订阅者数量,并在数量降至 0 时销毁队列。但我担心的是,如果没有正常关闭,服务很可能会被终止,因此它们将没有机会明确告诉守护进程他们不再监听。管理此问题需要我显式检查所有成员是否仍处于 Activity 状态,或者在 Hazlecast 发现某个成员已断开连接时订阅事件,然后跟踪该成员的所有订阅是否结束它们。有一个更好的方法吗?看起来过于复杂。理想情况下,我想要的是通过某种方式来查找队列上有多少当前成员在任何给定时间在队列上运行 take() ,如果为 0 并且队列上没有数据,则销毁它。 p>

谢谢, 特洛伊。

最佳答案

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

关于java - Hazelcast - 没有听众的队列,或向众多订阅者之一广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56027106/

相关文章:

java - 时间程序中的计算错误

java - 在中文文本上使用 Python 中的斯坦福解析器不起作用

java - 获取字符串的一部分(从 sth -> 到 sth )

hibernate - Hazelcast:如果内存不足会发生什么

java - 加载并保存 Hazelcast 分布式 map

csv - Hazelcast 外部排序。在大 csv 中对记录进行排序

java - 编译命令提示符时出现字符串args错误

docker - 如何使Hazelcast Management Center在docker中找到其节点?

hazelcast - 在创建 HazelcastInstance 后添加新的 Hazelcast 成员

java - 滚动 Pane 图形错误