rocketmq python api_【Python之路Day12】网络篇之Python操作RabbitMQ

本文介绍了消息中间件的重要性和流行方案,重点讲解了RabbitMQ的起源、应用架构、安装及Python API的使用。通过示例展示了生产者消费者模型,消息确认、持久化、公平调度等特性,最后探讨了发布/订阅模式。
摘要由CSDN通过智能技术生成

基础知识

分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。消息中间件这块在我们前面的学习中,是使用python中的queue模块来提供,但这个模块仅限于在本机的内存中使用,假设这个队列需要其他服务器的程序也访问的话,就需要利用socket了。不过,现成的方案很多,轮子已经有了,我们没有必要反复造轮子。直接拿来用就可以了。

消息中间件解决方案

流行的消息队列解决方案很多:

ZeroMQ,号称最快的消息队列,由于支持的模式特别多: TCP、IPC、inproc、Multicas,基本已经打到替代Socket的地步了。站点地址:http://zeromq.org/

Kafka,是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。 一个消息发布订阅系统,现在常用于日志团队使用的工具,如程序将操作日志批量异步的发送到Kafka集群中,而不是保存在本地或者DB中。Kafka可以提供批量提交消息/压缩等,对Producer而言,几乎感觉不到性能的开销。Consumer可以使用Hadoop等其他系统化的存储和数据分析等。站点:http://kafka.apache.org/

RocketMQ, 阿里开源的一款高性能、高吞吐量的消息中间件, 纯Java开发。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。站点:https://github.com/alibaba/RocketMQ

RabbitMQ, RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。

等等....

使用消息中间件的理由?

RabbitMQ

一. 历史

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。

RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。

二. 应用架构

这个系统架构图版权属于sunjun041640。

RabbitMQ Server: 是一种传入服务。 它的角色是维护一条从生产者(Producer) 到 消费者(Consumer)的路线,从而保证数据能够按照指定的方式进行传入。但是也并不是100%的保证,但杜宇普通的应用来说,应该是足够的。当然对于要求可靠性、完整性绝对的场景,可以再走一层数据一致性的guard, 就可以保证了。

Client A 和 Client B:生产者(Producer), 数据的生产者, 发送方。一个消息(Message)有两个部分:有效载荷(payload) 和 标签(label).

payload: 传入的数据

lable: exchange的名字或者说是一个tag, payload的描述信息,而且RabbitMQ是通过这个lable来决定把这个消息(Message)发给那个消费者(Consumer).AMQP仅仅描述了lable, 而RabbitMQ决定了如何使用这个lable的规则。

Client1, client2, client3: 消费者(Consumer), 接受消息的应用程序。当有消息(Message)到达某个和Consumer关联的某个队列后,RabbitMQ会把它发送Consumer。当然也可能会发送给多个Consumer。

一个数据从Producer到Consumer,还需要明白三个概念: exchanges, queue 和 bindings

queue:用于消息存储的缓冲

Connection: 一个TCP连接

Channels:虚拟连接。它建立在TCP连接中,数据流动都是channel中进行的。一般情况是起始建立TCP连接,第二部就是建立这个Channel。

三. 安装RabbitMQ

Ubuntu/Debian

apt-get install -y rabbitmq-server

RHEL6:

#安装配置epel源

#rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

#安装erlang

#yum -y install erlang

#安装RabbitMQ

#yum -y install rabbitmq-server

服务启动/停止

#停止服务#service rabbitmq-server stop

#启动服务#service rabbitmq-server start

#重启服务#service rabbitmq-server restart

安装Python API(Python3)

pip3 install pika#源码安装:

https://pypi.python.org/pypi/pika#过程略...

四. 基本操作

基于queue(Python2.7中模块是Queue)实现的生产者消费者模型

#!/usr/bin/env python3#-*- coding: utf-8 -*-#Author: DBQ(Du Baoqiang)

importqueueimportthreading

message= queue.Queue(10)defproducer(i):'''生产者

:param i:

:return:'''

whileTrue:

message.put(i)defconsumer(i):'''消费者

:param i:

:return:'''

whileTrue:

msg=message.get()for i in range(12):

t= threading.Thread(target=producer, args=(i,))

t.start()for j in range(10):

t= threading.Thread(target=consumer, args=(j,))

t.start()

View Code

#!/usr/bin/env python3#-*- coding: utf-8 -*-#Author: DBQ(Du Baoqiang)

import pika #导入模块

########### 生产者 #################

connection=pika.BlockingConnection(

pika.ConnectionParameters(host='172.16.30.162') #端口如果是默认的话,不用谢

) #建立TCP连接

channel= connection.channel() #虚拟连接,建立在上面的TCP连接基础上#为什么使用Channel,而不用TCP连接?#因为对于OS来说,建立和关闭TCP连接是有代价的,尤其是频繁的建立

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值