消息中间件RabbitMQ

RabbitMQ 安装---windows系统

RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。

Rabbitmq依赖于erlang环境,所以先要安装erlang;

执行:otp_win32_R16B03.exe

再安装Rabbitmq

执行:rabbitmq-server-3.2.3.exe

 

还需要配置环境变量:

添加环境变量:RABBITMQ_SERVER    path:D:\Program Files (x86)\rabbitmq\RabbitMQServer\rabbitmq_server-3.2.3

 给path变量添加内容,在其后面增加:;%RABBITMQ_SERVER%\sbin (注意前面的分号),然后确定即可

  Windows环境下默认配置文件为目录/%RabbitMQServer%/rabbitmq_server-3.3.5/etc下的rabbitmq.config.example文件,我们可以直接在这个文件中修改(可以不用去设置环境变量了),也可以自己再新建一个rabbitmq.config文件,然后把这个文件路径配置到环境变量中,这里介绍就直接修改rabbitmq.config.example文件。

启动rabbitmq

Cmd命令:

退一级目录,cd..

Cd D:\Program Files(x86)\rabbitmq\RabbitMQ Server\rabbitmq_server-3.2.3\sbinerlangsbin目录地址)

启用RabbitMQWeb管理插件

rabbitmq-plugins enable rabbitmq_management 

rabbitmq-service start--启动
rabbitmq-service stop--停止
rabbitmq-plugins list--查看插件命令
Mochiweb必须得有,MochiWeb是一个用来构建Web应用的轻便,高效的HTTP应用框架的Erlang
默认端口55672  账户密码:guest     http://localhost:55672/
 

docker环境中配置rabbitmq

rabbitmq的数据库名称规则是,NODENAME@hostnamedocker每次从docker image启动容器的时候会自动生成hostname,这样一来,你保存在主机上的数据库就会没用了,包括之前创建的用户也会没有了。所以在创建容器的时候必须指定--hostname=rabbitmqhostone,这样docker环境启动后rabbitmq就会一直读取固定目录中的数据了

RabbitMQ 作用 

对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability);如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:

 1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失?

 2)如何降低发送者和接收者的耦合度?

 3)如何让Priority高的接收者先接到数据?

 4)如何做到load balance?有效均衡接收者的负载?

 5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe不同的数据,如何做有效的filter

 6)如何做到可扩展,甚至将这个通信模块发到cluster上?

 7)如何保证接收者接收到了完整,正确的数据?

 

一个Message有两个部分:payload(有效载荷)和label(标签);

Connection(连接),Channel(通道,频道)

Connection:

 就是一个TCP的连接。ProducerConsumer都是通过TCP连接到RabbitMQ Server的。以后我们可以看到,程序的起始处就是建立这个TCP连接。

Channels:

 虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel

为什么使用Channel,而不是直接使用TCP连接?

对于OS来说,建立和关闭TCP连接是有代价的,频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。对于Producer或者Consumer来说,可以并发的使用多个Channel进行Publish或者Receive。有实验表明,1s的数据可以Publish10K的数据包。当然对于不同的硬件环境,不同的数据包大小这个数据肯定不一样,但是我只想说明,对于普通的Consumer或者Producer来说,这已经足够了。如果不够用,你考虑的应该是如何细化split你的设计。

使用ack确认Message的正确传递

 

每个Message都要被acknowledged(确认,ack)如果有数据没有被ack,那么:

 RabbitMQ Server会把这个信息发送到下一个Consumer。

 如果这个appbug,忘记了ack,那么RabbitMQ Server不会再发送数据给它,因为Server认为这个Consumer处理能力有限。

ack的机制可以起到限流的作用(Benefittothrottling):在Consumer处理完成数据后发送ack,甚至在额外的延时后发送ack,将有效的balance Consumerload

 

Rejecta message--丢弃消息

有两种方式,第一种的Reject可以让RabbitMQ Server将该Message发送到下一个Consumer。第二种是从queue中立即删除该Message

Creatinga queue

ConsumerProcuder都可以通过 queue.declare 创建queue

Exchanges 

Procuder PublishMessage进入了Exchange。接着通过“routing keys” RabbitMQ会找到应该把这个Message放到哪个queue里。queue也是通过这个routing keys来做的绑定。

     有三种类型的Exchangesdirect, fanout,topic每个实现了不同的路由算法(routing algorithm)。

·        Direct exchange:如果 routing key匹配,那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange

·        Fanout exchange:会向响应的queue广播。

·        Topic exchange:key进行模式匹配,比如ab*可以传递到所有ab*queue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值