客户端请求的顺序性
问题
通常的情况下,客户端发往服务器的请求通过 TCP 连接保证顺序性。但是在微服务下,客户端与服务器可能不是直接连接,中间会通过中介连接,而中介可能与多个服务实例连接。在客户端发送两个消息间隔很短的情况下(例如小于 1 毫秒),由于中介与服务的连接路由不同,就可能发生请求到达服务器顺序与客户端发出的顺序不一致问题。
解决方案
- 为请求添加一个序号字段,在一定范围内只增不减,在需要校验的地方可以通过等待、重排的方式修正顺序。
- 添加一个唯一序号标识也有助于实现幂等操作,例如将 订单号+状态 组合成 流水序列号,用来进行每次操作。
- 通常 MQ 等各种 Q 只支持”至少一次”或”最多一次”的逻辑而不支持”只做一次”逻辑,因为为了保证”只做一次”就需要 Q 维护一个消息消费表,而 Q 往往不愿意做这个维护,所以通常是消费客户端自己来保证。