开发者社区> 仙人掌win> 正文

启动服务后,如何同时持续监听消息队列(mns)的消息(工单解决全过程)?

简介:
+关注继续查看

我: 如何监听消息队列的消息?我使用django开发,在启动服务的的时候就开启监听,但是这样由于使用while True,导致服务启动阻塞.请问应该如何解决?

工程师: 多线程并发消费消息,可以参考: https://help.aliyun.com/document_detail/32451.html 虽然是java demo, 原理类似,可以拿来参考。


我: 看起来有点吃力,逻辑是当启动web服务的时候同时启动一个线程,这个线程执行receive_message

工程师: 这个线程执行receive_message 具体遇到什么问题? 具体堵塞在什么地方?


我: 之前的写法是这样,执行到message.receive_message()这里就停在这里了

message = Message(topic='user', queue='register') 
message.receive_message()

现在我改成了这样:

message = Message(topic='user', queue='register') 
threading.Thread(target=message.receive_message).start()

这样写好像就解决了我的问题

工程师: 抱歉,我们对django开发所知甚少。 相关开发问题,还需要您到相关开发社区去咨询一下。


我: 这跟django没有关系吧

工程师: 如果配置了长轮询https://help.aliyun.com/document_detail/34478.html 那么当队列没有消息时,receive_message会挂住,如果WaitSecond内有消息,立即返回;否则,会等到WaitSecond后才返回。
“执行到message.receive_message()这里就停在这里了” 停止了多长时间?


我: 长时间,一直没有执行下面的代码;还有一个问题,我使用的python的sdk,消息写入队列成功,但是取的时候出现错误,在你们的控制台也是base64出现乱码;我写入的消息内容只有Message内容, 消息取出的是如上图的结构吗?

工程师: 您好,消息的结构是这样的。请问您乱码问题在本地读取也是,还是只是控制台测试是这样?


我: 使用sdk的receive_message(wait_seconds)方法,会报Incorrect padding错误

工程师: 长轮询最长是30秒,如果超过30秒receive_message都没有返回,可以怀疑是代码的问题,建议使用单线程写个最简单的程序(官网python demo),先将receive_message调试成功。
关于乱码: queue提供的sdk,会默认对发送的消息做Base64 Encode,对接收到的消息做Base64 Decode。
所以如果使用queue sdk来发送,sdk接收是没有问题的。 在队列控制台点击“接收消息”时,您需要指定使用base64解码.


我: 问题好像已经解决了 1.开启进程可以解决持续监听队列消息的问题 2.关于编码问题,python sdk中, Queue和Topic都有发送消息的方法,Queue.send_message()默认经过base64编码,使用Queue.receive_message时默认解码所以可以正常执行(你们官方示例就是这样),但是Topic.publish_message()默认写入队列时未经过base64编码,但是官方未给出主题队列获取消息的示例,则同样使用Queue.receive_message获取消息,则会报错,只要在获取Queue示例queue后,再执行queue.set_encoding(False),然后在获取消息就不会报错了

工程师: topic提供的sdk, 默认是不做任何编解码的。
所以如果用sdk发送消息到topic, 配置推送消息到队列,用python sdk拉取队列消息,是会产生乱码的,需要自行做base64解码。
php: 从1.2.1版本开始,Queue提供了禁用Base64的选项,需要在getQueueRef的时候传入参数$base64 = FALSE;
java: 从1.1.0版本开始,消息Base64编码支持可选。 其他语言的queue sdk目前还不提供base64编解码可选。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
同步异步调用,并谈谈消息队列mq;RocketMQ发送消息和消费消息测试类
同步调用优点: 时效性强,打电话、直播,很快可以得到结果 同步调用的问题:
109 0
5. 消息队列中,如何保证消息的顺序性?
5. 消息队列中,如何保证消息的顺序性?
57 0
消息队列中消息的格式|学习笔记
快速学习消息队列中消息的格式
64 0
阿里云消息队列 Kafka-消息检索实践
本文章主要介绍消息队列使用过程中所遇到的消息丢失、重复消费等痛点问题的排查办法,以及消息队列 Kafka「检索组件」的场景实践,并对其关键技术进行解读。旨在帮助大家对消息队列 Kafka「检索组件」的特点和使用方式更加熟悉,以更有效地解决消息排查过程中所遇到的问题。
155 0
消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?(下)
消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?(下)
71 0
消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?(上)
消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?(上)
117 0
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(下)
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(下)
116 0
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(上)
消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?(上)
140 0
【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
93 0
+关注
仙人掌win
公众号Python码农
文章
问答
文章排行榜
最热
最新
相关电子书
更多
消息队列 Kafka 版差异化特性
立即下载
消息队列kafka介绍
立即下载
企业互联网架构之消息队列
立即下载