RabbitMQ的消息模式

RabbitMQ在应用中一定包含下面三种角色

  • 一个rabbitmq-client,作为消息发出者。
  • 一个rabbitmq-client,作为消息接收者。
  • 一个rabbitmq-server,作为中间转发broker。

生产者 - 消费者模式

一个消息只能被一个消费者取走
client端充当生产者或者消费者,消息都存储在server端的消息队列中。

客户端,不管是生产者还是消费者,都要连接到server先。

connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.117.175.50'))  //连接到server端

channel = connection.channel() // 

channel.queue_declare(queue='hello')   //声明server端消息队列的名称

对于生产者,向队列publish

channel.basic_publish(exchange='', routing_key='hello',  body='Hello World!') //routing_key设置为queue的名称

对于消费者,从队列中consume

def callback(ch, method, properties, body):
     ...
channel.basic_consume(callback, queue='hello', no_ack=True)   // 设计一个回调函数来处理消息。

参数delivery_mode的作用

delivery_mode = 2 意味着要publish的这条消息在server重启之后依然要不丢失。

channel.basic_qos(prefetch_count=X)的作用

在有多个消费者的情况下,默认的如果不设置prefetch_count,server会把消息轮流分给各个消费者去处理。

消费者如果设置了prefetch_count=1,那么它在处理完消息之后需要发出确认ack,
ch.basic_ack(delivery_tag = method.delivery_tag)
server只会在收到它的ack之后才会再分给它新消息。
server端挑选消费者的一个依据就是看消费者对应的channel上未ack的消息数是否达到其设置的prefetch_count个数。

发布 - 订阅模式

多播,一个消息被所有订阅者接收
发布者可以有多个,订阅者可以有多个。

需要设置exchange
channel.exchange_declare(exchange='logs', type='fanout') // 设置exchange的类型

对于消息发布者

channel.basic_publish(exchange='logs', routing_key='', body=message)  // routing_key设置为空

对于消息订阅者

result = channel.queue_declare(exclusive=True)

channel.queue_bind(exchange='logs', queue=result.method.queue)  // 绑定到特定的queue

def callback(ch, method, properties, body):
  print(" [x] %r" % body)

channel.basic_consume(callback, queue=result.method.queue, no_ack=True)

channel.start_consuming()

消息分类的发布-订阅模式

消息是有分类的,比如log条目的级别error/warn/info。
消息根据routing_key的设定进行Routing。
发布者按照分类进行消息发布,订阅者按需进行消息订阅。

对于发布者

channel.exchange_declare(exchange='direct_logs', type='direct')
channel.basic_publish(exchange='direct_logs', routing_key=severity, body=message)  // 需要设定当前消息的routing_key

对于订阅者

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

for severity in severities:
 channel.queue_bind(exchange='direct_logs', queue=queue_name, routing_key=severity)  // 需要按需绑定routing_key

消息多重分类的发布-订阅模式

消息的分类更多,还支持对分类进行正则匹配。注意通配符和别的地方不太一样。

  • . (dot) 点符号用来隔离不同级别的分类。
  • * (star) can substitute for exactly one word.
  • # (hash) can substitute for zero or more words.

对于发布者

channel.exchange_declare(exchange='topic_logs', type='topic')

channel.basic_publish(exchange='topic_logs', routing_key=routing_key, body=message) // 需要设定当前消息的

对于订阅者

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

for binding_key in binding_keys:
  channel.queue_bind(exchange='topic_logs', queue=queue_name, routing_key=binding_key)  // 需要按需绑定routing_key

RPC请求 - 响应模式

将rabbitmq设计成一个RPC服务框架。这个设计很有意思。
RPC请求者是主动方。PRC服务者是被动方。

RPC请求者,首先订阅消息,回调函数是处理PRC响应值。 客户端需要主动发布消息来作为RPC请求。

RPC服务者,首先订阅消息,回调函数是处理PRC的请求,计算,并发布消息来作为PRC的响应。

服务者取出一条消息(作为RPC请求,来自于某个请求者),之后会再发一条消息(作为RPC响应)给那个请求者。
所以需要设置 properties=pika.BasicProperties(correlation_id = props.correlation_id) 以记住消息请求者的身份。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的...
    高广超阅读 6,092评论 3 51
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,343评论 2 34
  • 本文章翻译自http://www.rabbitmq.com/api-guide.html,并没有及时更新。 术语对...
    joyenlee阅读 7,632评论 0 3
  • 对思维导图很感兴趣,自己也用了几次,感觉耳目一新,学习效果,分析效果超好。 读书时,先按照作者的思路画一张思维导图...
    爱存心间阅读 411评论 0 0