RabbitMQ

RabbitMQ消息幂等性问题

╄→гoц情女王★ 提交于 2020-12-13 00:42:02
文章目录 1. 什么是幂等性? 1.1 消息队列的幂等性 1.2 模拟重试机制 1.2.1 生产者代码 1.2.2 消费者代码 1.2.3 消费者 application.yml 配置 2. 如何保证消息幂等性,不被重复消费? 解决方法 1. 什么是幂等性? 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它。 简之:一个请求,不管重复来多少次,结果是不会改变的。 1.1 消息队列的幂等性 如同HTTP方法的幂等性,消息队列同样会出现幂等性问题。 消费者在消费 MQ 中的消息时,MQ 已把消息发送给消费者,消费者在给 MQ 返回 ack 时网络中断,故 MQ 未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息;注意,RabbitMQ 这种消息重试(补偿)机制是默认的。 所以,MQ 消费者的幂等性问题,主要在于 MQ 的重试机制,因为网络原因或客户端延迟消费导致重复消费。 那么,如何合适选择重试机制?我们来看两种情况。 情况1: 消费者获取到消息后,调用第三方接口,但接口暂时无法访问

celery worker only imports tasks when not detached

假装没事ソ 提交于 2020-12-12 10:01:37
问题 I'm trying to get my django app to submit tasks to a celery worker and it's succeeding when the worker is run attached. As soon as I add the --detach the tasks are failing to be registered. [2020-10-26 04:09:33,159: ERROR/MainProcess] Received unregistered task of type 'devapp.tasks.create_random_files'. The message has been ignored and discarded. Did you remember to import the module containing this task? Or maybe you're using relative imports? Please see http://docs.celeryq.org/en/latest

celery worker only imports tasks when not detached

亡梦爱人 提交于 2020-12-12 10:00:48
问题 I'm trying to get my django app to submit tasks to a celery worker and it's succeeding when the worker is run attached. As soon as I add the --detach the tasks are failing to be registered. [2020-10-26 04:09:33,159: ERROR/MainProcess] Received unregistered task of type 'devapp.tasks.create_random_files'. The message has been ignored and discarded. Did you remember to import the module containing this task? Or maybe you're using relative imports? Please see http://docs.celeryq.org/en/latest

celery worker only imports tasks when not detached

一曲冷凌霜 提交于 2020-12-12 10:00:34
问题 I'm trying to get my django app to submit tasks to a celery worker and it's succeeding when the worker is run attached. As soon as I add the --detach the tasks are failing to be registered. [2020-10-26 04:09:33,159: ERROR/MainProcess] Received unregistered task of type 'devapp.tasks.create_random_files'. The message has been ignored and discarded. Did you remember to import the module containing this task? Or maybe you're using relative imports? Please see http://docs.celeryq.org/en/latest

RabbitMq的几种模式

馋奶兔 提交于 2020-12-11 19:55:22
1.RabbitMq的队列的模式 2.RabbitMq的工作队列的模式 3.RabbitMq的发布订阅模式- Fanout 模式 什么是发布订阅的fanout的模式? fanout模式又称广播模式即就是在交换机接收到消息后向队列中发送消息是没有任何的规则的,单纯的就是将消息交给后面的队列组进行处理即可 ; 扇型交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。 4.RabbitMq的发布订阅模式- Direct 模式 直连型交换机,根据消息携带的路由键将消息投递给对应队列。 大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。 然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。 5.RabbitMq的发布订阅模式- Topic 模式 主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。 简单地介绍下规则: * (星号) 用来表示一个单词 (必须出现的) # (井号) 用来表示任意数量(零个或多个)单词 通配的绑定键是跟队列进行绑定的,举个小例子 队列Q1 绑定键为 *.TT.* 队列Q2绑定键为 TT.# 如果一条消息携带的路由键为 A.TT.B

关于rabbitMQ在yml配置手动ack不生效,重复答应的问题

泄露秘密 提交于 2020-12-11 04:33:43
关于rabbitMQ在yml配置手动ack不生效,重复答应的问题 在yml文件中配置了手动答应,但是消费者消费完成时,却还是自动答应 以下是yml配置 #rabbit配置 spring : rabbitmq : # rabbit地址 host : 127.0.0.1 # rabbit端口号 port : 5672 # 用户账号和密码 username : guest password : guest #rabbit项目名,每个virtualHost的队列是隔离的,相当于数据库 virtual-host : /rabbit #开启Publisher Confirms 模式,消息发送到交换器后触发回调。 #publisher-confirms: true #开启PublisherReturn 模式,交换机将消息发送到对应队列失败时触发 #publisher-returns: true listener : direct : #设置监听为手动答应模式 acknowledge-mode : manual 此处已经设置了手动答应,消费者代码是这样的: /** * 推送队列的监听 * 注解中为监听的队列 * @param * @param channel * @param tag * @throws IOException */ @RabbitListener ( queues =

国外一周标星131K+Star的Java后端成长路线笔记,下载量已超百万!

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-10 11:13:13
国外有一个爆火的开发人员学习路线,目前已经收获了 131 k+ star,在所有仓库中排名第 9 。 今天就主要为大家拆解一下“后端学习路线”! 下图是中文翻译版本,基本涵盖了一个后端程序员必须要掌握的一些通用的后端知识,非常直观! 你可以将其作为自己后端学习之路的重要参考。 学习路线配套得学习资料戳这里: 由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈! 笔记目录展示: 需要获取全部资料的话麻烦一键三连之后,然后加小助理VX:wjj2632646免费获取~ 需要获取全部资料的话麻烦一键三连之后,然后加小助理VX:wjj2632646免费获取~ 需要获取全部资料的话麻烦一键三连之后,然后加小助理VX:wjj2632646免费获取~ 部分内容截图: 需要获取全部资料的话麻烦一键三连之后,然后加小助理VX:wjj2632646免费获取~ 来源: oschina 链接: https://my.oschina.net/u

2020年5月中旬面试总结,至今最全的Java程序员高频面试知识点解析笔记!

不羁岁月 提交于 2020-12-09 13:10:56
就目前大环境来看,跳槽成功的难度比往年高很多。总结一下面试的感受:无论一面还是二面,都很考验Java程序员的技术功底!! 最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java程序员高频面试解析及知识点体系笔记.pdf(实际上比预期多花了不少精力),包含 集合,JVM,并发编程、Spring,MyBatis,微服务,Redis,Dubbo,设计模式,数据结构,分布式等!,由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示每部分的目录和答案截图,完整学习文档在文末有免费领取方式! 这份Java面试解析和知识点体系文档内容包括: Java 篇主要包含 Java集合 Hashmap、JVM、GC、锁、多线程、并发、代理、NIO 等。 MySQL数据库主要包含索引、B+ 树、SQL 优化相关。 分布式存储篇主要包含 Redis 架构相关、MongDB 分布式中间件主要包含 Kafka,RabbitMQ相关面试题 微服务Spring Boot、Spring Cloud、Dubbo 篇。 系统架构设计篇,根据几个开放性题目来设计系统。 框架篇主要包含 Spring MyBatis、SpringMVC,netty与RPC 设计模式篇 数据结构与算法篇 相信它会给大家带来很多收获。 Java程序员高频面试解析及知识点体系笔记 JVM篇——JVM知识点体系笔记 JVM篇

RabbitMQ REST HTTP JSON payload

人走茶凉 提交于 2020-12-08 06:32:55
问题 I am trying to use RabbitMQ HTTP REST client to publish messages into the queue. I am using the following url and request http://xxxx/api/exchanges/xxxx/exc.notif/publish { "routing_key":"routing.key", "payload":{ }, "payload_encoding":"string", "properties":{ "headers":{ "notif_d":"TEST", "notif_k": ["example1", "example2"], "userModTime":"timestamp" } } } And getting back from the rabbit the following response: {"error":"bad_request","reason":"payload_not_string"} I have just one header set

RabbitMQ REST HTTP JSON payload

风格不统一 提交于 2020-12-08 06:32:28
问题 I am trying to use RabbitMQ HTTP REST client to publish messages into the queue. I am using the following url and request http://xxxx/api/exchanges/xxxx/exc.notif/publish { "routing_key":"routing.key", "payload":{ }, "payload_encoding":"string", "properties":{ "headers":{ "notif_d":"TEST", "notif_k": ["example1", "example2"], "userModTime":"timestamp" } } } And getting back from the rabbit the following response: {"error":"bad_request","reason":"payload_not_string"} I have just one header set