Rocketmq: 异步发送消息,消息丢失问题

Created on 9 Apr 2020  ·  8Comments  ·  Source: apache/rocketmq

版本: 4.6.1
OS: Centos
部署方式:一主一从

问题描述:
采用DefaultMQProducer的异步发送方式,client端执行完send后,broker端无该消息的任何信息,本地也无任何响应回调,当时broker服务器上的cpu和内存也正常,查看了client,remoting,broker的日志也没有该消息的任何踪迹。

请问一下,这种情况的可能原因是什么?遇到这种问题从哪里入手查找?
谢谢

question

All 8 comments

Could you please paste some more info like the code of client-side, broker.log?

this is the producer code

@PostConstruct
    public void init(){
        producer = new DefaultMQProducer("PRODUCER_GROUP");
        producer.setNamespace(namesrvAddr);
        producer.setRetryTimesWhenSendAsyncFailed(3);

        try {
            producer.start();
        } catch (MQClientException e) {
            logger.error("========>  errMsg:{}", e.getMessage(), e);
        }

        logger.info("--------> producer group:PRODUCER_GROUP");
    }
public void sendJobInfo(TaServer taServer, JobInfoVO jobInfoVO, short sendType){
        try{
            logger.info("--------> send job info, ta:{}, job id:{}, send type:{}", taServer.getName(), jobInfoVO.getJob().getId(), sendType);

            JSONObject msgObj = new JSONObject();
            msgObj.put("jobInfo", jobInfoVO);
            msgObj.put("sendType", sendType);

            String msgObjJson = JSONObject.toJSONString(msgObj);

            Message msg = new Message("REQUEST_TOPIC" /* Topic */,
                    taServer.getFqdn()/*Tag*/,
                    new StringBuilder("job-req-").append(jobInfoVO.getJob().getId()).append("-").append(sendType).toString(), /*key e.g. job-req-1000-2*/
                    msgObjJson.getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );


            producer.send(msg, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    logger.info("-------->send job info success:{}", sendResult);
                }

                @Override
                public void onException(Throwable throwable) {
                    logger.info("-------->send job info error:{}", throwable.getMessage());
                }
            });


        } catch (Exception e) {
            logger.error("========> send job info failed, errMsg:{}", e.getMessage(), e);
        }
}

[producer log]
2020-04-03 05:14:20,529 [scheduler-7] INFO --------> send job info, ta:xxxxxx, job id:267374, send type:2
2020-04-03 05:14:20,620 [scheduler-7] INFO - --------> send job info, ta:xxxxxx, job id:267375, send type:2

[broker log]
2020-04-03 05:14:06 INFO brokerOutApi_thread_3 - register broker[0]to name server xxxxxx:9876 OK
2020-04-03 05:14:12 INFO brokerOutApi_thread_1 - register broker[1]to name server xxxxxx:9876 OK
2020-04-03 05:14:15 INFO BrokerControllerScheduledThread1 - Update slave consumer offset from master, xxxxxx:10911
2020-04-03 05:14:15 INFO BrokerControllerScheduledThread1 - Update slave delay offset from master, xxxxxx:10911
2020-04-03 05:14:25 INFO BrokerControllerScheduledThread1 - Update slave consumer offset from master, xxxxxx:10911
2020-04-03 05:14:25 INFO BrokerControllerScheduledThread1 - Update slave delay offset from master, xxxxxx:10911
2020-04-03 05:14:35 INFO BrokerControllerScheduledThread1 - Update slave consumer offset from master, xxxxxx:10911
2020-04-03 05:14:35 INFO BrokerControllerScheduledThread1 - Update slave delay offset from master, xxxxxx:10911
2020-04-03 05:14:36 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2020-04-03 05:14:36 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
2020-04-03 05:14:36 INFO brokerOutApi_thread_4 - register broker[0]to name server xxxxxx:9876 OK
2020-04-03 05:14:42 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2020-04-03 05:14:42 INFO brokerOutApi_thread_2 - register broker[1]to name server xxxxxx:9876 OK

it's the producer client log and broker log at that time, then has no response includes success or failed,
i can not find this message on the broker also.
the client sends about more 100 msgs and just losts these two.
this JVM includes more than one producer which has the same instanceName, it has a problem?

producer.setNamespace(namesrvAddr);
这个参数配置错了,你想配置的可能是 nameserver 地址?

这里确实配置错了,但是为什么也能正常工作呢?

这不叫能正常工作,可能是你没发现错误日志。另:namespace 是用来做隔离的

感谢,我对这个了解的不够深入,但目前99%的消息都可以正常发送,错误日志也没有任何提示,所以一直没有找到原因,在控制台也确实找到了注册的producer,也就是说这个配置会引起我上面这种未知的异常吗?

我再看看源码,深入了解下,非常感谢

  1. 要指定正确的 nameserver 地址,否则从 http://jmenv.tbsite.net:8080/rocketmq/nsaddr 得到 nameserver 地址。
  2. 如果 producer 设置了 namespace,consumer 拉取消息时,也要设置对应的 namespace
Was this page helpful?
0 / 5 - 0 ratings