我正在研究聊天实施。这个想法很简单,其中键是用户名,值是应该传递给用户的消息队列
这张地图由ConcurrentHashMap<String, <ConcurrentLinkedQueue<Message>>>
当用户的新消息到达时,它被写入此映射,每个用户使用简单的 http 池从队列中获取他们的消息。这种方法效果很好。
现在我需要在集群中实现类似的功能。对于缓存复制,我使用 jboss 缓存。现在缓存复制以同步方式工作。这意味着在写入其他节点之前不会在本地节点上写入缓存。
基本上缓存接口看起来类似于带有 put 和 get 方法的 map。
现在我会复制整个队列。当新消息到达时,我从地图中获取队列,在队列中添加新消息并在所有节点上“放置”(重写)新队列。
当用户请求获取新消息以克隆当前队列时,在所有节点上使与该用户关联的队列为空,并将消息从克隆队列传递给用户。
我觉得有很多情况下,可能会出现问题。例如,我将消息放在节点 A 的队列上,队列的复制开始,现在另一个节点 B 上的用户从队列中获取消息,使队列为空。稍后从节点 A 复制队列完成,节点 B 再次收到已传递的消息。用户两次收到相同的消息
在集群中实现此消息例程的常用方法是什么?