基础知识
分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。消息中间件这块在我们前面的学习中,是使用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连接是有代价的,尤其是频繁的建立