账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    如何延迟提交ack
    53
    0
    有一个这样的场景,JMS接MQ消息,消息由于某些原因(比如处理时间长)被投入到异步线程池中去处理了,此时消息未被处理完,不能确认(ack),但是消息处理完了消息所在的jms线程早已结束,无法确认了,有没有什么方法可以解决这个问题。
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 紫梦风铃 普通会员 1楼

      在一些分布式系统中,比如 Kafka、RabbitMQ 等,有“ACK”(Acknowledged)消息的延迟提交机制。以下是延迟提交 ACK 的几种常见方法:

      1. 设置延迟
      2. 在创建或者更新 Kafka 或 RabbitMQ 话题时,设置延迟时间。例如,创建一个新的主题时,可以设置为 "延迟 ACK",并在后续的 Acknowledge 消息发送时,将延迟时间设置为 1 秒。例如: $ kafkacat create topic <topic-name> -D topic.replication.factor=1 -D topic.idle.ms=1
      3. 在 RabbitMQ 中,设置主题的 ack 设置,可以使用队列的 ack 参数,例如: rabbitmqctl setqueue <queue-name> ack 1
      4. 在 Kafka 中,设置队列的 ack 参数,可以使用 broker 设置,例如: kafka.properties advertised-topic.delay.ms=1

      5. 重置延迟

      6. 如果在发送 Acknowledgement 消息后,需要立即提交 ACK,可以在发送 Acknowledgement 消息后,先将其设置为 "非延迟" 或 "延迟确认",然后再设置为 "延迟"。例如: $ kafkacat send <queue-name> --acknowledgement=non-delayed --acknowledgement-time=1000 --acknowledgement-expiration-time=5000
      7. 在 RabbitMQ 中,可以使用队列的 non-delayed 消息属性,设置为 "非延迟" 或 "延迟确认"。例如: rabbitmqctl setqueue <queue-name> non-delayed
      8. 在 Kafka 中,可以使用 broker 设置,设置队列的 non-delayed 消息属性,例如: kafka.properties advertised-topic.non-delayed.consumer.poll.interval.ms=1000

      9. 设置默认延迟

      10. 如果用户希望在 Acknowledgement 消息发送时,不设置延迟,但期望在后续的消息发送时,自动提交 ACK,可以在 Kafka 或 RabbitMQ 的主题设置中,设置默认的 Acknowledgement 等待时间。例如: $ kafka.properties topic.auto-commit-delay.ms=0 $ rabbitmqctl setqueue <queue-name> auto-commit=true
      11. 在 RabbitMQ 中,可以在队列的 auto-commit 消息属性中设置默认的 Acknowledgement 等待时间。例如: rabbitmqctl setqueue <queue-name> auto-commit=true

      12. 使用 ZooKeeper/Consistency Group

      13. 在一些分布式系统中,如 ZooKeeper 或 Consistency Group,有类似于 Kafka 的延迟提交机制。在 ZooKeeper 中,可以通过创建一个 'kafka.consumer.commit-latency' 或 'kafka.consumer.commit-timeout' 配置项来设置 Kafka 应用程序在发送 Acknowledgement 消息时的延迟时间。例如: zookeeper.qos.commit-latency=1000 zookeeper.qos.commit-timeout=5000
      14. 在 Consistency Group 中,可以使用 Consistency Group 的 commit-latency 和 commit-timeout 配置项来设置 Kafka 应用程序在发送 Acknowledgement 消息时的延迟时间。例如: <consistency-group name="my-consistency-group"> <members> <member node="1" address="127.0.0.1:9092" port="9092"/> </members> <commit-latency>1000</commit-latency> <commit-timeout>5000</commit-timeout> </consistency-group>

      注意,设置 "acknowledgement-time" 或 "commit-latency" 时,需要确保这两个参数与 ZooKeeper 或 Consistency Group 的其他配置项(如 timeout、quorum、order-of-service 等)相匹配,以避免分布式系统的资源竞争问题。

    • 半个闲人 普通会员 2楼

      在一些分布式系统中,比如 Kafka、RabbitMQ 等,有“ACK”(Acknowledged)消息的延迟提交机制。以下是延迟提交 ACK 的几种常见方法:

      1. 设置延迟
      2. 在创建或者更新 Kafka 或 RabbitMQ 话题时,设置延迟时间。例如,创建一个新的主题时,可以设置为 "延迟 ACK",并在后续的 Acknowledge 消息发送时,将延迟时间设置为 1 秒。例如: $ kafkacat create topic <topic-name> -D topic.replication.factor=1 -D topic.idle.ms=1
      3. 在 RabbitMQ 中,设置主题的 ack 设置,可以使用队列的 ack 参数,例如: rabbitmqctl setqueue <queue-name> ack 1
      4. 在 Kafka 中,设置队列的 ack 参数,可以使用 broker 设置,例如: kafka.properties advertised-topic.delay.ms=1

      5. 重置延迟

      6. 如果在发送 Acknowledgement 消息后,需要立即提交 ACK,可以在发送 Acknowledgement 消息后,先将其设置为 "非延迟" 或 "延迟确认",然后再设置为 "延迟"。例如: $ kafkacat send <queue-name> --acknowledgement=non-delayed --acknowledgement-time=1000 --acknowledgement-expiration-time=5000
      7. 在 RabbitMQ 中,可以使用队列的 non-delayed 消息属性,设置为 "非延迟" 或 "延迟确认"。例如: rabbitmqctl setqueue <queue-name> non-delayed
      8. 在 Kafka 中,可以使用 broker 设置,设置队列的 non-delayed 消息属性,例如: kafka.properties advertised-topic.non-delayed.consumer.poll.interval.ms=1000

      9. 设置默认延迟

      10. 如果用户希望在 Acknowledgement 消息发送时,不设置延迟,但期望在后续的消息发送时,自动提交 ACK,可以在 Kafka 或 RabbitMQ 的主题设置中,设置默认的 Acknowledgement 等待时间。例如: $ kafka.properties topic.auto-commit-delay.ms=0 $ rabbitmqctl setqueue <queue-name> auto-commit=true
      11. 在 RabbitMQ 中,可以在队列的 auto-commit 消息属性中设置默认的 Acknowledgement 等待时间。例如: rabbitmqctl setqueue <queue-name> auto-commit=true

      12. 使用 ZooKeeper/Consistency Group

      13. 在一些分布式系统中,如 ZooKeeper 或 Consistency Group,有类似于 Kafka 的延迟提交机制。在 ZooKeeper 中,可以通过创建一个 'kafka.consumer.commit-latency' 或 'kafka.consumer.commit-timeout' 配置项来设置 Kafka 应用程序在发送 Acknowledgement 消息时的延迟时间。例如: zookeeper.qos.commit-latency=1000 zookeeper.qos.commit-timeout=5000
      14. 在 Consistency Group 中,可以使用 Consistency Group 的 commit-latency 和 commit-timeout 配置项来设置 Kafka 应用程序在发送 Acknowledgement 消息时的延迟时间。例如: <consistency-group name="my-consistency-group"> <members> <member node="1" address="127.0.0.1:9092" port="9092"/> </members> <commit-latency>1000</commit-latency> <commit-timeout>5000</commit-timeout> </consistency-group>

      注意,设置 "acknowledgement-time" 或 "commit-latency" 时,需要确保这两个参数与 ZooKeeper 或 Consistency Group 的其他配置项(如 timeout、quorum、order-of-service 等)相匹配,以避免分布式系统的资源竞争问题。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部