面试题答案
一键面试设计思路
- 消息头部添加元数据:在拆分后的每个消息头部添加元数据,包含这批数据的唯一标识(如UUID)、总消息数、当前消息序号。这使得接收端能够识别哪些消息属于同一批数据,并知道它们的顺序。
- 固定大小拆分:以 1MB 为单位对 5MB 数据进行拆分,不足 1MB 的部分单独作为一个消息。例如,5MB 数据拆分为 5 个 1MB 的消息(假设数据刚好可整除,实际可能会有余数处理)。这样可以保证每个消息都能在消息队列的大小限制内。
- 接收端缓存与重组:接收端根据消息头部的元数据,将属于同一批的消息缓存到内存中,按照消息序号进行排序,然后将所有消息的数据部分按顺序拼接起来,从而还原原始的 5MB 数据。
关键技术点
- 消息序列化与反序列化:为了在消息头部添加元数据并保证消息能在网络中传输,需要对消息进行序列化和反序列化。常用的序列化方式有 JSON、Protocol Buffers 等。例如使用 Protocol Buffers 定义消息结构,将元数据和数据部分一起序列化,接收端再反序列化。
- 消息唯一标识生成:确保生成的唯一标识具有足够的随机性和唯一性,避免不同批次数据标识冲突。可以使用 UUID 生成算法,如 Java 中的
java.util.UUID.randomUUID()
方法。 - 接收端并发处理与数据一致性:在高并发场景下,接收端可能同时收到多个不同批次的消息。需要通过唯一标识和消息序号进行准确排序和重组,同时要保证缓存机制在多线程环境下的线程安全性,例如使用线程安全的集合类(如 Java 中的
ConcurrentHashMap
)来缓存消息。