为了简单起见,让我们假设我正在克隆Twitter(不是)。因此,每个用户都可以跟随其他用户,并被其他用户跟随。对于您关注的每个用户,您都会收到他发送的所有推文。一切都存储在数据存储中(无论是NoSQL解决方案还是分片的关系数据库)。
但是,当用户在线时,您认为让他们通过JMS接收推文而不是轮询数据库并检索新推文是否合适:
据称,其背后的想法是提高性能-即,不要过于频繁地查询数据存储区,而是将即时的内容缓存在内存中。
整个过程当然可以在集群中运行,并且具有可伸缩性。
但是我不确定:
在某个时候(当事情正常时),我将进行一些基准测试,但是我想听听一些初步的看法。
最佳答案
听起来足够合理。您需要确保您选择的JMS实现支持潜在的大量主题-并非所有主题都能做到这一点。
我的主要设计问题是,当用户首次登录时,他的消息 session 存储将为空,而您必须等待它填满。然后,您还是不必非要访问数据库,否则这不是问题。
另外,您在这里并没有真正利用事件驱动的JMS特性。从该主题收到的消息仅被转储到 session 存储中,以供以后检索。
由于它不是真正由事件驱动的,因此您也许可以考虑使用分布式内存数据存储,例如EhCache + JGroups或JBossCache3(我强烈建议)。新的推文将放入该分布式商店中,读者只需在其上进行搜寻以寻找感兴趣的物品。这可能会提高内存效率,因为每个推文的一个副本只能存储在每个节点上。您也可以在系统启动时预加载缓存。
关于java - JMS(或任何消息传递解决方案)是否适合关注者/关注模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3606802/