面试题答案
一键面试消息格式
- 消息头:
- 消息ID:唯一标识一条消息,用于去重、确认等操作。例如采用UUID,保证全球唯一。
- 源节点ID:标识消息的发送者节点。
- 目标节点ID:标识消息的接收者节点。
- 消息类型:如请求、响应、通知等,用于区分不同功能的消息。
- 序列号:用于保证消息顺序,在同一发送者 - 接收者对之间,按递增顺序赋值。
- 消息体:具体的业务数据,格式可根据应用场景确定,如JSON、XML等通用格式,或自定义二进制格式以提高传输效率。
路由算法
- 基于分布式哈希表(DHT):
- 每个节点维护一个哈希表,将节点ID和对应的网络地址映射起来。
- 计算目标节点ID的哈希值,通过哈希表查找最近的节点。
- 节点收到消息后,根据目标节点ID的哈希值,转发给距离目标更近的节点,直至消息到达目标节点。
- 容错机制:
- 当某个节点故障无法响应时,其他节点在一定时间(如超时时间)后,从路由表中移除该故障节点信息。
- 重新计算路由路径,选择其他可达节点进行消息转发。
可靠性保障机制
- 确认机制:
- 接收方收到消息后,根据消息ID回复一个确认消息给发送方。
- 发送方设置一个定时器,若在定时器超时前未收到确认消息,则重发该消息。
- 消息持久化:
- 发送方在发送消息前,将消息持久化到本地存储(如日志文件)。
- 若重发一定次数(如3次)后仍未收到确认,可从持久化存储中读取消息继续尝试发送。
- 冗余传输:
- 对于关键消息,可选择多个路径进行发送(多路径路由)。
- 接收方收到重复消息时,根据消息ID进行去重处理。
处理脑裂异常情况
- 选举机制:
- 采用分布式选举算法,如Raft算法。
- 每个节点在启动时,处于Follower状态,等待Leader节点的心跳消息。
- 若在一定时间内未收到心跳,Follower节点发起选举,竞争成为Leader。
- 数据一致性:
- Leader节点负责协调数据同步,向其他节点发送更新消息。
- 其他节点收到更新消息后,先持久化到本地,再回复确认消息。
- 若出现脑裂,不同分区可能产生不同的Leader。但通过选举算法的规则,如任期号(Term),新的Leader会覆盖旧的分区数据,保证最终一致性。
- 网络分区检测:
- 节点定期发送心跳消息给其他节点,同时接收其他节点的心跳。
- 通过监控心跳的接收情况,判断是否发生网络分区。若一定时间内未收到大部分节点的心跳,则认为可能发生脑裂。