我正在寻找有关基于JMS的架构的建议......
我的应用程序需要代表数千个不同的目的地接收JMS消息,然后通过非JMS协议(即这是一个网关)传送到目的地。允许的解决方案适用于最初通过发送到一个JMS队列或每个目标转到一个队列的所有消息。
解决方案需要在大量目的地(以及每秒许多消息)中表现良好。
要求是:
提前致谢
答案 0 :(得分:1)
听起来您可以使用每个目标一个队列将来自不同发布者的邮件传递到网关。然后,网关需要是多线程的,每个队列消费者有一个线程。因此,对于发布到n个目的地的x个生产者,网关将需要n个线程,每个目的地一个。此体系结构将为您提供吞吐量,该吞吐量由网关在将消息转发到其最终目标之前对消息执行的处理量以及在网关之前由最终目标处理消息所需的时间来控制可以发送以下信息。
此设计有两个缺点:
如果您可以控制发布者,您是否更愿意使用所选择的目标协议将消息直接从发布者传输到最终目的地,而无需通过网关(除了作为一个网关之外似乎没有任何其他目的)性能瓶颈和单点故障)?如果您能够实现这一目标,那么您的下一个任务就是将最终目的地教给多处理请求,尽可能放宽订单约束(要求#2)。
您的另一个选择是进行批处理。在任何给定的时间点,消费者都会排出队列中的所有可用消息并立即批量处理它们。这意味着您必须执行同步消息使用(Consumer#receive()),而不是使用onMessage进行异步消费。
答案 1 :(得分:1)
@Mesocyclone:基于上述Moe提供的问题和解决方案的输入,我可以推荐您正在寻找的可能解决方案。
您可以在网关应用程序内部为每个目标引入一个队列。示例dest1queue,dest2queue等,只有一个输入队列暴露给接收消息。您可以让一个MDB线程侦听部署在不同服务器上的每个内部队列。 对于例如dest1queue由server1上的MDB(单线程)监听,dest2queue由server2上的MDB(单线程)监听,dest3queue由server3上的MDB(单线程)监听...
所以基本上流程是: -
在网关应用程序之外公开的单输入队列 - >消息由MDB的1个或多个实例接收,其唯一目的是将传入消息路由到内部队列 - >内部队列(每个目标一个)仅由1个MDB线程监听(因为您不需要一个目标的并行性),它处理消息并与目标进行通信。
以上设计的好处是: -