MST

星途 面试题库

面试题:设计一种消息拆分策略以适配消息队列大小限制

假设你使用的消息队列对单个消息大小限制为 1MB,现在需要传输一批平均大小为 5MB 的数据。请设计一种有效的消息拆分策略,确保拆分后的消息能顺利在消息队列中传输,并且在接收端能准确无误地重组。阐述设计思路以及涉及到的关键技术点。
17.8万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 消息头部添加元数据:在拆分后的每个消息头部添加元数据,包含这批数据的唯一标识(如UUID)、总消息数、当前消息序号。这使得接收端能够识别哪些消息属于同一批数据,并知道它们的顺序。
  2. 固定大小拆分:以 1MB 为单位对 5MB 数据进行拆分,不足 1MB 的部分单独作为一个消息。例如,5MB 数据拆分为 5 个 1MB 的消息(假设数据刚好可整除,实际可能会有余数处理)。这样可以保证每个消息都能在消息队列的大小限制内。
  3. 接收端缓存与重组:接收端根据消息头部的元数据,将属于同一批的消息缓存到内存中,按照消息序号进行排序,然后将所有消息的数据部分按顺序拼接起来,从而还原原始的 5MB 数据。

关键技术点

  1. 消息序列化与反序列化:为了在消息头部添加元数据并保证消息能在网络中传输,需要对消息进行序列化和反序列化。常用的序列化方式有 JSON、Protocol Buffers 等。例如使用 Protocol Buffers 定义消息结构,将元数据和数据部分一起序列化,接收端再反序列化。
  2. 消息唯一标识生成:确保生成的唯一标识具有足够的随机性和唯一性,避免不同批次数据标识冲突。可以使用 UUID 生成算法,如 Java 中的 java.util.UUID.randomUUID() 方法。
  3. 接收端并发处理与数据一致性:在高并发场景下,接收端可能同时收到多个不同批次的消息。需要通过唯一标识和消息序号进行准确排序和重组,同时要保证缓存机制在多线程环境下的线程安全性,例如使用线程安全的集合类(如 Java 中的 ConcurrentHashMap)来缓存消息。