Jms ActiveMQ:处理速度慢的使用者

Jms ActiveMQ:处理速度慢的使用者,jms,activemq,producer-consumer,broker,Jms,Activemq,Producer Consumer,Broker,关于ActiveMQ:我有一个场景,其中我有一个生产者将小文件(大约10KB)发送给消费者。虽然这些文件很小,但消费者需要大约10秒钟来分析它们并将结果返回给制作人。我已经研究了很多,但我仍然无法找到以下问题的答案: 如何使代理将文件(完全)存储在队列中 我应该使用ObjectMessage(因为文件很小)还是blob消息 由于使用者处理速度较慢,我应该降低其预取限制还是使用循环调度策略?哪一个更好 最后,在ActiveMQ常见问题解答中,我读到了这样的内容:“如果一个消费者收到一条消息,并且在

关于ActiveMQ:我有一个场景,其中我有一个生产者将小文件(大约10KB)发送给消费者。虽然这些文件很小,但消费者需要大约10秒钟来分析它们并将结果返回给制作人。我已经研究了很多,但我仍然无法找到以下问题的答案:

  • 如何使代理将文件(完全)存储在队列中
  • 我应该使用ObjectMessage(因为文件很小)还是blob消息
  • 由于使用者处理速度较慢,我应该降低其预取限制还是使用循环调度策略?哪一个更好
  • 最后,在ActiveMQ常见问题解答中,我读到了这样的内容:“如果一个消费者收到一条消息,并且在关闭之前没有确认它,那么该消息将被重新传递给另一个消费者。”。所以我这里的问题是,ActiveMQ是否保证只有一个使用者将处理消息(因此只有一个生产者的答案),或者不?消费者何时确认消息(在默认的自动确认设置中)-何时接收消息并将其存储在会话中,或者何时onMessage处理程序完成?此外,由于消费者的处理速度非常慢,我是否应该更改一些“超时限制”,以便经纪人知道在将工作交给另一个消费者之前需要等待多长时间(这与我之前的问题有关)
    不确定其他人,但这里有一些想法

    第一:我不知道你真正关心的是什么。ActiveMQ在数据存储中存储消息;所有数据不需要驻留在内存中的任何单个位置(代理或客户端)。所以你应该在这方面做得很好;早期版本确实要求所有ID都必须装入内存(不确定是否解决了这个问题),但即使是内存使用率也足够低,除非您有数以千万计的队列消息

    至于ObjectMessage与blob;原始字节数组(blob)应该是最紧凑的表示形式,但由于所有这些都是为了存储而序列化的,所以它只会影响客户端上的内存使用。预取主要有助于降低访问延迟;但考虑到它们的处理速度很慢,您可能不需要任何预取;所以是的,要么将其设置为1或2,要么完全禁用

    至于保证:分布式消息队列能够保证的最好保证是至少一次(有可能重复),或者最多一次(没有重复,可能会丢失消息)。通常最好至少进行一次,并让客户端使用客户端提供的ID进行重复数据消除。如何发送确认由JMS规范定义,因此您可以阅读更多关于JMS的信息;这不是特定于ActiveMQ的。
    是的,您应该将超时设置得足够高,以便工作人员通常能够完成工作,包括所有网络延迟。这可能会减慢已删除邮件的重新传输速度(如果工作已结束),但这对您来说可能不是问题。

    非常感谢您的快速回复!实际上,我读到的一些关于JMS的内容(例如-)没有提到,或者与我读到的关于ActiveMQ的内容相矛盾。例如,在那篇文章中,它说消息存储在队列中(因此生产者不必在消费者消费消息时处于活动状态),这是我在activeMQ网站上找不到的。另外,它还说在队列模型(我所说的模型)中,只有一个消费者获得消息(正如您所说,ActiveMQ不保证这一点)。但它确实存储消息,因为这是消息队列(异步操作)的全部要点。有些模式没有完全的持久性,只是将它们保留在代理的内存队列中,但这是您必须配置的。