启动服务后,如何同时持续监听消息队列(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编解码可选。

相关文章
|
3月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4天前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
6天前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
30 4
|
10天前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
45 4
|
1月前
|
消息中间件 运维 监控
云消息队列RabbitMQ实践解决方案评测报告
本报告旨在对《云消息队列RabbitMQ实践》解决方案进行综合评测。通过对该方案的原理理解、部署体验、设计验证以及实际应用价值等方面进行全面分析,为用户提供详尽的反馈与建议。
62 16
|
1月前
|
消息中间件 弹性计算 运维
阿里云云消息队列RabbitMQ实践解决方案评测报告
阿里云云消息队列RabbitMQ实践解决方案评测报告
57 9
|
29天前
|
消息中间件 监控 数据处理
解决方案 | 云消息队列RabbitMQ实践
解决方案 | 云消息队列RabbitMQ实践
43 1
|
1月前
|
消息中间件 弹性计算 运维
云消息队列RabbitMQ实践
本评测报告详细分析了阿里云云消息队列 RabbitMQ 版的实践原理、部署体验及核心优势。报告认为其在解决消息积压、脑裂难题及弹性伸缩方面表现优秀,但建议进一步细化架构优化策略和技术细节描述。部署文档详尽,对初学者友好,但仍需加强网络配置和版本兼容性说明。实际部署展示了其高可用性和成本优化能力,适用于高并发消息处理和分布式系统数据同步。为进一步提升方案,建议增加安全性配置指导、性能调优建议及监控告警系统设置。
|
18天前
|
消息中间件 监控 测试技术
云消息队列RabbitMQ实践 - 评测
根据反馈,对本解决方案的实践原理已有一定理解,描述整体清晰但需在消息队列配置与使用上增加更多示例和说明以助理解。部署体验中获得了一定的引导和文档支持,尽管文档仍有待完善;期间出现的配置文件错误及依赖库缺失等问题已通过查阅资料解决。设计验证展示了云消息队列RabbitMQ的核心优势,包括高可用性和灵活性,未来可通过增加自动化测试来提高系统稳定性。实践后,用户对方案解决问题的能力及适用场景有了明确认识,认为其具有实际生产价值,不过仍需在性能优化、安全性增强及监控功能上进行改进以适应高并发和大数据量环境。
34 0

相关产品

  • 云消息队列 MQ