一.AMQP(Advanced Message Queuing Protocol)
提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,是面向消息的中间件设计。基于此协议的客户端与消息中间件可以传递消息,并不受客户端/中间件类型、开发语言等条件的限制。
RabbitMQ是基于Erlang Virtual Runtime的AMQP的实现。因此可以跨语言的实现消息传递。(TODO:实现javascript与java的消息交互)
二.一些概念
1.AMQP是异步消息协议,关于消息通信的基本方式有两种:
1)同步方式
两个通信应用服务器之间必须进行同步,即发送方在发送消息之后需要等待接收方返回对于消息的回馈,之后才能进行下一步。
2)异步方式
两个通信应用服务器无需在线等待,发送方发送消息之后可以直接进行下一步操作,但是也因此无法获得发送方反馈。
tips:RabbitMQ有用到ACK机制,它默认是开启的。当消费者获取Message之后,并正确处理之后会返回给RabbitMQ服务器一个确认消息,服务器收到确认消息会从queue中删掉这个Message。而如果消费者再处理时报错,没有返回确认消息,这个消息会被再次被发送(可能是给自己,也可能是给另外的消费者)。RabbitMQ并没有设置消息处理的超时时间,也就是说消费者可以一直处理下去,当消费者突然中断连接才会判断处理失败。这也带来一个问题,当由程序手动返回acknowledge消息时,如果出现bug没有返回acknowledge则不会再给这个消费者分发消息。
2.Producer:消息的发送方
3.Exchange:交换机,发送方并不会直接将消息发送给消费者,每种Exchange都有自己的路由规则
1)direct exchange:QueueName会默认作为RoutingKey来使用。Exchange会按照完全匹配的方式,将消息发送到对应的Queue中。
2)fanout exchange:广播式的exchange,发送方使用fanout Exchange的时候并不需要指定Queue的RoutingKey,消息会发送给所有绑定到fanout Exchange上的队列。
3)topic exchange:使用方式最自由的exchange,这个exchange可以绑定一个正则表达式。符号“#”会匹配一个或多个词,符号“*”匹配一个词。exchange会对发送方发送的RoutingKey进行正则匹配,消息会发送到所有匹配到的队列中。
3.Queue:队列,存储消息的结构
4.RoutingKey:交换机与队列绑定,RoutingKey就是绑定(binding)的逻辑。