Bootstrap

中间件-Redis、RabbitMQ、Zookeeper

一、Redis

1)、Redis高并发与快速响应原因

  1. redis纯内存,读写速度特别块
  2. redis单线程,避免线程切换和静态消耗
  3. redis使用IO多路复用技术,可以处理并发连接

2)、IO多路技术

单个线程通过跟踪记录每一个I/O流的状态来同时管理多个I/O流。主要实现技术有三种select、poll、epoll。epoll中有三个方法:

  1. 当执行epoll_create时,创建了红黑树和就绪列表;
  2. 当执行epoll_ctl时,若增加socket包炳,则检查红黑树是否存在,存在则立即返回,不存在添加红黑树。然后向内核注册回调函数,用于中断事件来临时向准备就绪列表中插入数据;
  3. 当执行epoll_wait时,立即返回准备就绪列表中的数据。

二、RabbitMQ

消息生产者生产的消息通过交换器绑定到对应的队列中去,消息消费者通过信道消费消息队列中的消息。

1)、交换器有四种类型:

  1. Direct键:如果路由键完全匹配,消息就被投递到相应的队列
  2. Fanout广播分发:如果交换器收到消息,将会广播到所有绑定的队列上
  3. topic模式匹配:可以使来自不同源头的消息通过匹配规则能够到达同一个队列
  4. headers:不常用,与Direct一致,匹配AMQP消息的header。

2)、消息生产者如何确认消息被正确发送到队列

  1. 将信道设置为confirm模式,所有发送到信道的消息都会生成一个唯一确定的ID
  2. 一旦消息被发送到目的队列或者消息被持久化,那么就会给消息生产者发送一个确认
  3. 若RabbitMQ内部错误导致消息丢失,会发送一条未确认通知给消息生成者

3)、消息消费者如何确认接收了消息

消费者没接收一条消息,都必须进行确认。只有消费者确认了消息,RabbitMQ才会从队列中删除消息。

4)、如何避免消息重复投递或重复消费

  1. 消息生产时,MQ针对每一条消息都会生成一个唯一确定的ID,作为去重和幂等性依据
  2. 消息消费时,每一个消息体都必须要有一个全局业务唯一ID,作为去重和幂等性依据

三、Zookeeper

Zookeeper集群是一个基于主从复制的高可用集群,有三种角色:

  1. leader:所有写操作必须通过leader完成再由leader将写操作广播给其他服务器。只要有超过半数节点写入成功,该写请求就会被提交
  2. follower:follower可直接处理并返回客户端的读请求。同时会将写请求转发给leader处理。并且负责在leader处理写请求时对请求进行投票。
  3. observer:不参与投票,可接收客户端的连接,并将写请求转发给leader节点

1)、工作原理(原子广播)

  • Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在leader崩溃后,Zab就进入了恢复模式,当leader被选举出来,且大多数server完成了和leader的状态同步之后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。
  • 为了保证事务一致性,zk采取了递增的事务id号(zxid)标识事务。所有提议都被加上了zxid。zxid由64位组成,高32位用来标识leader变化,低32位用来递增。

2)、投票机制

  1. 每个server启动以后都询问其他server投票给谁,对于其他server的询问,server会根据自身状态回复自己推荐的leader的id和上一次处理事务的zxid。(系统启动时,每个server都会推荐自己)
  2. 收到所有server后,计算出zxid最大的那个server,并将下一次投票server信息设置为它
  3. 计算获得票数最多的server为获胜者。超过半数,则被选为leader。否则,继续这个过程。
  4. leader开始等待server连接。
  5. follower连接leader,将最大的zxid发送给leader。
  6. leader根据follerer的zxid确定同步点,至此选举结束。
  7. 选举阶段完成leader同步后通知folloer已经称为update状态。
  8. follower收到update消息后,可以重新连接client的请求进行服务。

 

 

 

;