rabbitMQ基础知识

rabbitMQ基础应用 java demo地址

github链接

消息状态:

  • ready:消费者还能从队列中获取到消息的条数
  • unacked: 消费者还没有返回确认的消息条数
  • total: 队列中消息总数 total=ready+unacked

simple queue

simple
  • 默认exchange,队列名作为routingKey

work queue

work
  • 多个消费者消费同一个队列
  • 轮询分发Round-robin dispatching
    • 1.消息队列中的消息/新产生的消息,轮询现有消费者,平均分配到每个消费者
    • 2.如果确定其中某个消费者无法确认消息(ack),没确认的消息会变为ready,再次轮询分配到现有消费者
    • 3.ready数量为0表示所有消息已指定消费者,无法再被其他消费者消费。即使有空闲的消费者,而某个消费者还有大量消息没有消费完也不会分配到空闲的消费者
    • 4.total = ready + unacked
    • 5.当autoAck = true时,消费者接收到消息就进行了ack,并不代表消费者完成了消费回调
    • 6.当autoAck = false时,需要在消费回调中主动ack消息,一般在消费完成之后进行ack,表示消息消费完成
  • 公平分发Fair dispatch
    • 1.设置每次发送给消费者的消息数量qos=N,此时autoAck只能为false,也就是必须手动确认消息
    • 2.每次消费 ready - N, unacked + N
    • 4.N条消息全部确认,才会继续发送给该消费者下N条消息
    • 5.ready不为0时,就不会出现空闲的消费者,解决了消费能力差的消费端消息堆积的问题

publish/subscribe

fanout
  • fanout类型的exchange,会将所有发送到该exchange的消息发送到所有绑定的队列,跟routingKey无关
  • 其中某一队列遵从work队列的轮询分发和公平分发

routing

routing
  • direct类型的exchange,队列绑定到交换机时需指定routingKey

topic

topic
  • 匹配字符
    • * 星号匹配一个词
    • # 井号匹配0个或多个词
  • routingKey 可以通过通配符进行路由

rpc

rpc
  • 生产者在发送消息的配置属性中,配置好correlation_id和reply_to队列
  • 消费者接收到消息,处理好消息再将处理结果发送到reply_to队列,结果同时配置好correlation_id
  • 生产者发送消息后同步等待reply_to队列,拿到消息匹配结果同时配置好correlation_id成功后,取出处理结果

消息确认机制与消息持久化

  • 消费端消息应答
    • 自动确认模式
      boolean autoAck = true;

      一旦rabbitmq把消息分发给消费者,就会从broker的内存中删除。

      这种情况下如果杀死正在执行的消费者,就会丢失正在处理的消息。
    • 消息应答模式
      boolean autoAck = false;

      如果有一个消费者挂掉,就会交付给其他消费者,rabbitmq支持消息应答,消费者发送一个消息应答告诉rabbitmq这个消息我已经处理完成,可以删除,然后rabbitmq就删除内存中的消息
    • 消息应答模式默认开启,即boolean autoAck = false;
  • 生产者消息确认
    • 事务机制
      • client发送Tx.Select 开启事务
      • broker发送Tx.Select-Ok(之后publish)
      • client发送Tx.Commit 提交事务
      • broker发送Tx.Commit-Ok
      • 性能很差
    • confirm模式
      • publisher confirm模式并不是默认打开的,需要调用confirm.select方法将channel设置成confirm模式。当开启了confirm模式之后,只有当一条消息被所有的mirrors接受之后,publisher才会收到这条消息的confirm,也就是一个basic.ack方法。
      • waitForConfirms 同步confirm,单个或批量确认消息
      • addConfirmListener 异步confirm
      • 性能好
  • 消息持久化
    • boolean durable = true; 开启持久化
    • boolean durable = false; 关闭持久化
    • rabbitmq 不允许重新定义(不同参数)已存在的队列

部分api

  • exchangeDeclare
    • exchange,交换器名称
    • type,交换器类型,如fanout,direct,topic
    • durable,是否持久化,持久化可以将交换器存盘,在服务器重启后不会丢失相关信息
    • autoDelete,是否自动删除。自动删除的前提是至少有一个队列或交换器与这个交换器绑定,之后所有与这个交换器绑定的队列或交换器都与此解绑,并不是与此连接的客户端都断开
    • internal,是否是内置的,内置的交换器客户端无法直接发送消息到这个交换器中,只能通过交换器路由到交换器的方式
    • argument 其他一些结构化参数
  • queueDeclare
    • queue,队列名称
    • durable,是否持久化
    • exclusive,是否排他,如果一个队列声明为排他,该队列仅对首声声明它的连接可见,并在连接断开后自动删除
    • autoDelete,是否自动删除。自动删除前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才自动删除
    • arguments,其他参数
      • x-message-ttl 队列中消息过期时间
      • x-max-priority 1.队列开启优先级,2.队列最大优先级
      • x-expires 队列的过期时间,当队列未使用(没有任何消费者、没有被重新声明、过期时间段内未调用过Basic.Get命令)时,会被删除。服务器重启后,持久化的队列过期时间会重新计算,x-expires单位为毫秒,不能设置为0
  • basicPublish
    • exchange 交换器
    • routingKey 路由键
    • mandatory 告诉服务器至少将消息路由到一个队列中,否则将消息返回生产者(basic.return),为false则丢弃
    • immediate 是否立即投递,告诉服务器,如果该消息关联的队列上有消费者,立即投递,没有消费者,则返回消息给生产者,不用将消息存入队列等待
    • props
      • expiration 单条消息过期时间(若x-message-ttl也设置,取最短的ttl。由队列属性设置的过期时间,消息到期后,会直接从队列中抹去;单独设置设置的,在投递前进行判断)
      • priority 优先级
  • basicConsume
    • queue,队列名称
    • autoAck,是否自动确认,建议为false,不自动确认
    • callback,消费者的回调函数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容