有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hazelcast队列没有侦听器,或向多个订阅者之一广播

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

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

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

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

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

谢谢,, 特洛伊


共 (1) 个答案

  1. # 1 楼答案

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