我有一个用例,队列需要 24/7 全天候运行,因此冗余是关键,因此需要多可用区。除此之外,我想确保发送到队列的消息满足以下要求,但我之前从未配置过 AMQ 或 ActiveMQ,所以我有点迷茫。
- 队列重新启动期间消息保留 = 持久模式
- 消息可以被多个消费者读取
- 消息在第一次读取后不会立即从队列中掉出来(确认)
- 可能将消息的生命周期配置为在 48 小时等时间窗口内可用。
任何满足这些要求的 XML 配置示例或指南都非常棒。我在网上找不到太多关于第 2-4 项的内容。
ActiveMQ 是一个符合 JMS 的消息代理。您列出的大多数要求都由生产者端的属性控制。
我在答案中使用了 Java 片段。
MessageProducer producer = session.createProducer(session.createQueue(queueName)); producer.setDeliveryMode(DeliveryMode.PERSISTENT);
向多个收件人发送消息是一种“发布者-订阅者”模式,而不是“生产者-消费者”模式。创建一个作为多个客户端订阅目标的主题。否则,您希望每个收件人都有一个队列。JMS 主题示例。
在这些选项中选择适合您的任何模式:https ://docs.oracle.com/cd/E19798-01/821-1841/bncfw/index.html 。您可能需要使用方法CLIENT_ACKNOWLEDGE
手动发送确认。acknowledge()
在 JMS 会话上设置确认模式:
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
producer.setTimeToLive(ttl);
Amazon SQS 也遵守 JMS 协议,因此上面针对 1、3、4 的 ActiveMQ API 示例对 SQS 仍然有效,因为 SQSConnection 类扩展了 javax.jms.Connection。请按照入门指南了解更详细的步骤。
SQS 提供有关消息持久性的保证 ( https://aws.amazon.com/message-queue/features/ );
Pub/Sub 模式也适用于 Amazon MQ ( https://aws.amazon.com/pub-sub-messaging/ )。