MST

星途 面试题库

面试题:复杂业务逻辑下Redis事务补偿与多类型消息队列协同架构设计

在一个复杂的金融交易系统中,涉及多种交易类型(如转账、投资、提现等),每种交易都需要在Redis中进行事务处理确保数据一致性,同时通过消息队列异步通知不同的下游系统(如账务系统、风控系统、报表系统等)。并且不同类型的消息有不同的优先级和处理策略。请设计一个完整的架构,详细说明Redis事务补偿机制如何与多类型消息队列协同工作,包括数据结构设计、消息路由策略、异常处理以及整体系统的可扩展性设计等方面。
45.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

架构设计总体概述

  1. 系统分层:分为交易处理层、消息队列层、下游系统层。交易处理层负责接收和处理交易请求,与Redis交互进行事务处理;消息队列层负责接收交易结果并将消息发送到下游系统;下游系统层负责根据接收到的消息进行相应业务处理。

Redis事务补偿机制

  1. 数据结构设计:在Redis中,使用Hash数据结构存储交易相关信息。例如,每个交易可以有一个唯一的交易ID作为Hash的Key,Hash的Field可以包含交易类型、交易金额、交易状态等信息。同时,为了实现事务补偿,在Hash中添加一个字段记录事务执行步骤和状态。
  2. 事务处理流程
    • 开启Redis事务,将交易相关操作命令入队,如对账户余额的增减、交易记录的写入等。
    • 执行事务,如果事务执行成功,标记交易状态为成功。如果事务执行失败,记录失败原因,并根据失败步骤进行补偿操作。例如,如果在扣除账户余额成功但写入交易记录失败,那么需要进行补偿操作,将扣除的余额加回。
    • 使用Lua脚本来确保事务操作的原子性,避免并发问题。

多类型消息队列

  1. 数据结构设计:消息队列中的消息可以设计为JSON格式,包含交易ID、交易类型、消息优先级、具体业务数据等字段。
  2. 消息路由策略
    • 基于交易类型:不同交易类型的消息路由到不同的消息队列。例如,转账消息发送到“transfer_queue”,投资消息发送到“investment_queue”。
    • 基于优先级:对于高优先级的消息(如涉及大额资金的交易),可以发送到专门的高优先级队列,优先处理。可以使用优先级队列(如RabbitMQ的优先级队列)来实现。
  3. 异常处理
    • 消息发送异常:如果消息发送到队列失败,记录失败日志,并进行重试机制。可以设置重试次数和重试间隔,如重试3次,每次间隔1秒。
    • 消息处理异常:下游系统处理消息失败时,将消息放入死信队列(DLQ),并通知相关人员进行人工处理。死信队列中的消息可以包含失败原因等详细信息。

整体系统的可扩展性设计

  1. 水平扩展
    • 交易处理层:可以使用负载均衡器(如Nginx)将交易请求均匀分配到多个交易处理服务器上,提高系统的并发处理能力。
    • 消息队列层:对于消息队列,可以采用集群模式,如Kafka的多Broker集群,提高消息处理能力和可靠性。
    • 下游系统层:每个下游系统可以部署多个实例,通过负载均衡器接收消息队列发送的消息,实现水平扩展。
  2. 异步处理:通过消息队列的异步处理机制,将交易处理和下游系统处理解耦,避免下游系统处理缓慢影响交易处理的性能。同时,消息队列可以缓冲大量消息,在高并发情况下起到削峰填谷的作用。
  3. 监控与报警:部署监控系统(如Prometheus + Grafana)对系统的关键指标(如交易成功率、消息队列积压量、下游系统处理延迟等)进行监控,设置报警阈值,及时发现系统问题并进行处理。