基础用法

消息确认模式( AcknowledgeMode )
  • NONE:自动确认,一旦消息到达了消费者端即视为该消息无误了。该情况可能会出现若消费者端出现了异常,而此时又自动确认了,因此容易导致消息删除,容易造成消息丢失。
  • AUTO:根据情况确认
    • 执行无异常将自动确认
    • 执行抛出 AmqpRejectAndDontRequeueException 异常将被拒绝,但不会重新进入队列
    • 执行抛出 ImmediateAcknowledgeAmqpException 异常将会被确认接收
    • 其他异常,且设置的requeue参数(重新进入队列)为true则会拒绝
  • MANUAL:手动确认,自定义拒绝策略

使用过程出现问题

  • 编写队列发送后,消费者端无法接收。
    **检查 **mq-config.properties 配置文件中 cmq.forbiddenCreate 参数是否为false,允许创建队列
    #CMQ配置
    mq.type=cmq
    #CMQ队列URL
    cmq.queue.endpoint=https://cmq-queue-gz.api.qcloud.com
    #CMQ主题URL
    cmq.topic.endpoint=https://cmq-topic-gz.api.qcloud.com
    #是否禁止创建队列或者主题true禁止,false可以创建
    cmq.forbiddenCreate=false
    cmq.secretId=AKIDb8VkogVrAHD3mYJaoqgLrHbzEIAqDcic
    cmq.secretKey=32ub8TcFj29qRr6A3lLkJl5EOQHwPglf
    
  • 消息发送失败。
    配置文件中的ID 及其 key 是否合法或者相匹配,需要着重关注是否因为是账号过期或者更换过key导致

解决幂等问题

** **使用缓存,通过拼接一段由门店ID及其订单号组成的字符串,将该段字符串作为key存储进缓存中,并设置时效为30s。以此来控制并发问题,防止由于消息重发导致重复统计问题。

** **注:设置的时效时需要考虑到,MQ的重发延迟时间及其次数,防止由于消息的重发导致重复统计

reenKey = "ACTIVITY_STATISTICS_DISCOUNT_" + msgBody.getOutMchId() + "_" +      msgBody.getListid();
//添加一个用于控制并发的缓存
boolean addFlag = cacheClient.add(reenKey, "1", 30);
if (!addFlag) {
    result.setRetcode(ConsumerErrorCode.ERR_CACH_ADD);
    LOG.error("[{}]-有折扣活动正在处理中:msgBody={}", ThreadLocalUtils.getThreadSerial());
    return result;
}

标题:CMQ使用相关总结
作者:JonLv
地址:http://39.108.183.139:8080/articles/2023/03/11/1678548117189.html