Java 具有多个JVM的并发hashmap可伸缩性

Java 具有多个JVM的并发hashmap可伸缩性,java,concurrency,Java,Concurrency,目前的执行情况: 有一个队列,消息从该队列推送到一个组件,消息从该组件被放置在DB中并被进一步处理。它涉及许多数据库调用,并且需要更多的时间。因此,我们需要用不同的方法来修改它 一个这样的解决方案是:拥有一个并发Hashmap,其中key作为头id,value作为并发链接的消息队列 Dispatcher–根据消息头id隔离传入消息,并将它们放置在ConcurrentHashMap中,其中key作为id,值位于ConcurrentLinkedQueue中 Worker–Worker线程是一个调度线

目前的执行情况:

有一个队列,消息从该队列推送到一个组件,消息从该组件被放置在DB中并被进一步处理。它涉及许多数据库调用,并且需要更多的时间。因此,我们需要用不同的方法来修改它

一个这样的解决方案是:拥有一个并发Hashmap,其中key作为头id,value作为并发链接的消息队列

  • Dispatcher–根据消息头id隔离传入消息,并将它们放置在ConcurrentHashMap中,其中key作为id,值位于ConcurrentLinkedQueue中
  • Worker–Worker线程是一个调度线程,它将以指定的时间延迟重复调用处理器。它通过执行器将分组在每个标头id下的单个队列发送给处理器。一旦某个特定的头id在映射中为空,它就会将其删除
  • Processor–从队列(ConcurrentLinkedQueue)中逐个轮询消息并对其进行处理
  • 另外,我的一位同事评论道:“该方法应该是可伸缩的,因为我们正在考虑从不同主机运行的组件的另一个实例。”


    请解释一下。如何做到这一点?非常感谢您提供的任何指导、链接或帮助。

    也许您需要Hazelcast()之类的东西,例如,我恐怕这个问题对我来说没有多大意义。任何具有单个
    ConcurrentHashMap
    的解决方案都不会“扩展”到单个JVM之外。相反,当您访问多个JVM时,组件需要相互通信。在任何人对性能问题发表评论之前,您需要指定各个组件的位置以及它们的通信方式。但将来可能会增加一台服务器。在这种情况下,如何使这项工作?一些事情,比如把映射放在缓存中等等。或者我担心解决方案是完全错误的?好吧,关键是从一个JVM到多个JVM是一个重要的重新架构。你让它工作。。。。以规范的方式;i、 e.让客户机和服务器发送请求和回复,或使用消息队列系统(MQ/Tivoli、JMS等)。关于这个主题,有很多书……对于单个JVM案例,您的建议并非不合理。但是,性能将取决于平均和峰值请求速率、处理请求所需的典型时间等因素。这些事情很难衡量,也很难预测。您是进行估算和计算的最佳位置。。。。不是我们,看看Redis