一、Redis
1)、Redis高并发与快速响应原因
- redis纯内存,读写速度特别块
- redis单线程,避免线程切换和静态消耗
- redis使用IO多路复用技术,可以处理并发连接
2)、IO多路技术
单个线程通过跟踪记录每一个I/O流的状态来同时管理多个I/O流。主要实现技术有三种select、poll、epoll。epoll中有三个方法:
- 当执行epoll_create时,创建了红黑树和就绪列表;
- 当执行epoll_ctl时,若增加socket包炳,则检查红黑树是否存在,存在则立即返回,不存在添加红黑树。然后向内核注册回调函数,用于中断事件来临时向准备就绪列表中插入数据;
- 当执行epoll_wait时,立即返回准备就绪列表中的数据。
二、RabbitMQ
消息生产者生产的消息通过交换器被绑定到对应的队列中去,消息消费者通过信道消费消息队列中的消息。
1)、交换器有四种类型:
- Direct键:如果路由键完全匹配,消息就被投递到相应的队列
- Fanout广播分发:如果交换器收到消息,将会广播到所有绑定的队列上
- topic模式匹配:可以使来自不同源头的消息通过匹配规则能够到达同一个队列
- headers:不常用,与Direct一致,匹配AMQP消息的header。
2)、消息生产者如何确认消息被正确发送到队列
- 将信道设置为confirm模式,所有发送到信道的消息都会生成一个唯一确定的ID
- 一旦消息被发送到目的队列或者消息被持久化,那么就会给消息生产者发送一个确认
- 若RabbitMQ内部错误导致消息丢失,会发送一条未确认通知给消息生成者
3)、消息消费者如何确认接收了消息
消费者没接收一条消息,都必须进行确认。只有消费者确认了消息,RabbitMQ才会从队列中删除消息。
4)、如何避免消息重复投递或重复消费
- 消息生产时,MQ针对每一条消息都会生成一个唯一确定的ID,作为去重和幂等性依据
- 消息消费时,每一个消息体都必须要有一个全局业务唯一ID,作为去重和幂等性依据
三、Zookeeper
Zookeeper集群是一个基于主从复制的高可用集群,有三种角色:
- leader:所有写操作必须通过leader完成再由leader将写操作广播给其他服务器。只要有超过半数节点写入成功,该写请求就会被提交
- follower:follower可直接处理并返回客户端的读请求。同时会将写请求转发给leader处理。并且负责在leader处理写请求时对请求进行投票。
- observer:不参与投票,可接收客户端的连接,并将写请求转发给leader节点
1)、工作原理(原子广播)
- Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在leader崩溃后,Zab就进入了恢复模式,当leader被选举出来,且大多数server完成了和leader的状态同步之后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。
- 为了保证事务一致性,zk采取了递增的事务id号(zxid)标识事务。所有提议都被加上了zxid。zxid由64位组成,高32位用来标识leader变化,低32位用来递增。
2)、投票机制
- 每个server启动以后都询问其他server投票给谁,对于其他server的询问,server会根据自身状态回复自己推荐的leader的id和上一次处理事务的zxid。(系统启动时,每个server都会推荐自己)
- 收到所有server后,计算出zxid最大的那个server,并将下一次投票server信息设置为它
- 计算获得票数最多的server为获胜者。超过半数,则被选为leader。否则,继续这个过程。
- leader开始等待server连接。
- follower连接leader,将最大的zxid发送给leader。
- leader根据follerer的zxid确定同步点,至此选举结束。
- 选举阶段完成leader同步后通知folloer已经称为update状态。
- follower收到update消息后,可以重新连接client的请求进行服务。