名词解释:
- Producer:生产者,由生产者来发消息
- Message:消息,由payload和label组成,
- payload:消息传输的数据
- label:exchange的名字,作为tag
- Exchanges:Producer发送消息的时候会发到这里,然后Exchange再根据与queue绑定的规则分发消息到queue里
- Bindings: exchange和queue之间的规则,确定是否要把消息发到queue里
- queue:这个是消息最终存储的地方,有Consumer进行消费,消费之后queue的这个消息就被删除掉了
- Consumer:数据的接收方,consumer从queue中拿到数据
- Connection:Producer和Consumer都是通过TCP连接到RabbitMQ Server的,
- Channels:它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。目的是保持长连接,减少tcp创建的性能损耗
- Subscribe:订阅,有Consumer对某个queue进行消费
- acknowledged(ack):确认,由Consumer将消息消费完毕后给server的回执确认,Server确认后会把消息从queue中删除
- Direct:Exchange的一种类型,如果 routing key 匹配, 那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange
- Fanout: Exchange的一种类型,所有与exchange关联的queue都会被传递
- Topic: Exchange的一种类型,按照routingkey规则匹配的queue
- routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“aa.bb.cc”
- binding key与routing key一样也是句点号“. ”分隔的字符串
- binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)
- Virtual hosts:对exchange和queue进行分组,类似mysql数据库的概念,可以对hosts进行权限的分配
- user:可以创建用户,并且给用户配置对vhosts的权限
- 权限:分为读,写,管理
分发机制
- 默认机制
- 第n个消息发送给第n个consumer,无论是否这些consumer的消息是否ack了
- 这样有可能导致负载不均衡,有些很忙,有些比较闲
- 公平机制
- prefetch_count,使用这个配置,但consumer消费能力达到prefetch_count时不再推送消息(有prefetch_count个消息没有ack)
高可用方案
- 镜像+haproxy
扩展
- 序列化方案
- fastjson
- ProtoBuf