我有一个由3人组成的Hazelcast设置(版本3.11)。每个成员定义一个主题,用于接收其他成员的响应:
int myServerId = ...
MessageListener<Response> listener = ...
TopicConfig cfg = new TopicConfig( "response-" + myServerId );
cfg.addMessageListener( listener );
其他成员之一收到请求(通过单独的可靠主题)时,将对其进行处理并发送回响应:
UUID correlationId = ...
Response response = ...
ITopic<Response> responseTopic = hazelcastInstance.getTopic( "response-" + fromServerId );
responseTopic.publish( response );
LOG.debug( "Sent response fromServerId={}, toServerId={}, correlationId={}: {}", myServerId, requestingServerId, correlationId, response );
回到原始节点,我要连续快速发送3-5条消息。在接收节点上,我看到那些进来,正在处理中,并发布了对该主题的响应:
2018-10-31 13:42:45,326 DEBUG [REMOTE] (connection-2) Sent response fromServerId=2, toServerId=1, correlationId=159153cf-636d-4165-8b48-8ffcbcf33ffa: ...
但是在原始节点上,我只看到一些消息进入。有时候,不是5条消息中的1条。其他时候他们都进来了。
我尝试在配置中定义所有3个主题(response-1,response-2,response-3),并且只定义了其中一个主题(对应于serverId)的侦听器,似乎没有什么不同。启动HazelcastInstance之后,我也尝试添加监听器,但没有任何改善。
然后,我将两者结合在一起(定义所有主题,但是一旦HazelcastInstance启动并可用就注册一个侦听器。也没有任何改变。
当我采用最初的方法为每个成员(包括一个侦听器)定义一个主题并进行更改时,问题就消失了,因此我在所有成员上定义了所有主题,并且在建立HazelcastInstance之后仅在每个节点上添加一个侦听器。
答案 0 :(得分:0)
Hazelcast中的常规主题不能保证邮件的传递。相反,您可以使用ReliableTopic
功能。请在此处查看详细信息:https://docs.hazelcast.org//docs/latest/manual/html-single/index.html#reliable-topic