P4

消息协议:
用途:给不同进程(java,c),服务之间的约定的规范。
消息协议为什么不用tcp/ip协议或者http协议:
1.因为tcp/ip协议太复杂,消息协议只需要传输数据,用不着。
2.http协议是短连接,如果服务器宕机或者挂了,消息就没了,不支持持久化,但是消息协议需要支持持久化。
1.AMQP协议:高级消息队列协议(RabbitMQ)
优点:
支持分布式,支持持久化,高性能高可靠
ps:底层用erlang开发,必须安装erlang环境(类似于jdk)
2.MQTT协议
rabbitMQ默认关闭,可以打开。
3.OpenMessage协议
RocketMQ支持,阿里,滴滴,雅虎开发。
优点:
结构简单,解析速度快,支持事务和持久化。
4.kafka协议
优点:
速度快,基于tcp/ip协议,直接传输二进制,支持持久化
缺点
不支持事务,在分布式中略显无力

P5:

消息队列必须支持持久化,也就是存在磁盘中。

P6:

消息分发策略:
**1.发布订阅:**100条消息在中间件中,三个消费者的话,就每人100条。
只要有人订阅了,那么消息都能收到。
2.轮询分发:100条消息,不管消费顺序,但是永远是公平的,每人33条。
不管服务器性能如何,都是公平的。
3.公平分发:100条消息,性能最快的消费50条,慢一点的30条,最慢的20条。
根据服务器性能来的,能者多劳。
(轮询分发和公平分发,一条消息都不会被消费两次,即A消费了消息a,那么B不会再消费消息a)

除了kafka,其他都支持消息重发(中间件没收到成功的应答),如果消费者有集群,第一个没有应答,则投递到第二个服务器。。。

P7:

高可用:无论出现什么故障,都必须得以执行。

集群模式:

1.Master-slave主从共享数据:
master和slave共享消息存储(文件/数据库),master负责写入消息,其他所有的都能读取到消息/数据。如果master挂了就写入不了了。

2.master-slave主从同步部署:
消息写入到master中,master中同步数据到slave中生成副本,其中一个挂了可以从其他的副本中读取。但是消息的同步和拷贝需要占用很大的带宽和网络资源。

3.多主多从同步
消息过来,给每个节点都写入一份,master和slave都写入,消费者也可以从任意节点读取。

4.多主集群转发部署
消息过来只储存一些数据的描述及存放位置到元数据信息,消费者从一个服务器中的元数据信息中匹配,如果没有匹配到,则把这个请求转发到另外一台服务器中去匹配。

5.多主多从
配置多个一主多从。