大舅开发-从小白到弃坑之路【openstack】-rabbitMQ

总结下openstack中rpc的机制

  总之,RabbitMQ提供的是一个消息队列,那么很自然的使用rabbitMQ这周方式是经典的生产者-消费者模式。故存在一个或多个生产者pubisher,向队列中发送消息,同样存在一个或多个消费者consumer来读取数据。由于需要发送的消息很多,发往不同消费者也多,因此需要将消息发送给不同的消息队列,这样存在一个exchange来将消息路由到不同的队列,队列需要一个key,则消息需要一个对应的key。所以使用rabbitMQ需要几个基本的对象queue、而exchange(有rabbitMQ来维护)。因此,还需要存在一个connection来连接rabbitMQ Server 同时由于需要多个connection 故使用eventlets.pools.pool来维护一个全局的pool,来管理这些connection。

  Publisher通过connection将消息按照method和args的方式发送到RabbitMQ Server对应的队列上,Consumer则轮询该队列,有了msg,则通过connection将该msg取出来,解析出msg的method和args,由于consumer在创建时,已经注册了一个callback函数,由于不同的msg需要调用不同的method,为了解决这个问题,故使用了一个RpcProxy来代理这个callback函数。所以consumer取出msg后,调用RpcProxy来处理msg,最后完成msg指定方法的调用。由于msg特别多,执行的任务时间也长,故是使用greenthread来执行每个method。

 

self.conn = rpc.create_connection(new=True)
LOG.debug = (_("Creating Consumer connection for service is") % self.topic)

rpc_dispatcher = self.manager.create_rpc_dispatcher() # 返回一个回调的实例

# share this same connection for these Comsumer
self.conn.create_consumer(self.topicm rpc_dispatcher, fanout=False)
node_topic = '%s.%s' % (self.topic, self.host)
self.conn.create_consumer(node.topicm rpc_dispatcher, fanout=False)

self.conn.create_consumer(self.topicm rpc_dispatcher, fanout=True)

# Consume from all consumers  in a thread
self.conn.consumer_in_thread()

                                                                                                                                                                                              

posted @ 2020-10-29 10:50  塔大舅°  阅读(60)  评论(0)    收藏  举报