当前位置: 首页 > ops >正文

outbox架构解说

Outbox 模式是一种用于实现数据一致性的架构模式,特别是在微服务架构中。

它确保在处理事务时,数据的原子性和最终一致性。

Outbox 模式的详细解说:

1. 概念与背景

  • 背景:在微服务架构中,一个操作可能涉及多个服务,每个服务都有自己的数据库。
  • 为了保证数据的一致性,通常需要使用分布式事务。
  • 然而,传统的两阶段提交(2PC)等分布式事务机制在微服务环境中实现复杂且性能较低。
  • 概念:Outbox 模式通过将事件或消息的发布与数据库事务绑定在一起,确保在事务提交后,事件或消息能够被可靠地发布。

2. 工作原理

Outbox 模式的核心思想是将事件或消息存储在数据库的同一个事务中,然后通过一个单独的进程或服务将这些事件或消息发布出去。

具体步骤如下:

1.事务开始:应用程序开始一个数据库事务,包含对业务数据的修改和事件或消息的插入。

2.插入事件:在同一个事务中,将事件或消息插入到一个专门的 "outbox" 表中。

3.事务提交:提交事务。如果事务成功,事件或消息也被持久化到数据库中。

4.事件发布:一个单独的进程或服务(通常称为 "outbox processor" 或 "message relay")定期轮询 "outbox" 表,将新事件或消息发布到消息代理(如 Kafka、RabbitMQ 等)。

5.事件删除:发布成功后,事件或消息从 "outbox" 表中删除。

    3. 优点

    • 原子性:确保业务数据和事件或消息的原子性,避免数据不一致。
    • 可靠性:通过数据库事务保证事件的持久化,避免消息丢失。
    • 解耦:将事件发布与业务逻辑解耦,简化系统架构。
    • 可扩展性:适用于高并发和大规模分布式系统。

    4. 缺点

    • 复杂性:引入了额外的组件和流程,增加了系统复杂性。
    • 延迟:事件发布可能会有一定的延迟,因为需要等待 outbox processor 处理。
    • 数据库负载:额外的插入和查询操作可能会增加数据库的负载。

    5. 实现方式

    • 数据库表:使用一个专门的 "outbox" 表来存储事件或消息。
    • 轮询机制:outbox processor 定期轮询 "outbox" 表,发布新事件或消息。
    • 事务日志:另一种实现方式是使用数据库的事务日志(如 MySQL 的 binlog)来捕获事件,然后通过 CDC(Change Data Capture)工具发布事件。

    6. 示例

    假设有一个订单服务,当创建订单时,需要同时更新订单表并发送一个 "订单创建" 事件到消息代理。

    用Outbox 模式的具体步骤如下:

    1.开始事务

    BEGIN TRANSACTION;
    

    2.插入订单

    INSERT INTO orders (id, customer_id, amount, status) VALUES (1, 100, 250, 'pending');
    

    3.插入事件

    INSERT INTO outbox (id, event_type, payload, created_at) VALUES (1, 'OrderCreated', '{"orderId":1,"customerId":100,"amount":250}', NOW());
    

    4.提交事务

    COMMIT;
    

    5.事件发布:outbox processor 定期查询 outbox 表,发布事件到消息代理,然后删除已发布的事件。

      7. 与其他模式的比较

      • Transactional Outbox vs. Transactional Messaging
        • Transactional Outbox:使用数据库表存储事件,然后通过轮询或 CDC 发布事件。
        • Transactional Messaging:直接在事务中发送消息到消息代理,可能需要两阶段提交。

      8. 总结

      Outbox 模式是一种有效的数据一致性解决方案,特别适用于微服务架构。

      它通过将事件或消息的发布与数据库事务绑定在一起,确保了数据的原子性和最终一致性。

      虽然引入了额外的复杂性和延迟,但提供了更高的可靠性和可扩展性。

      联系方式:https://t.me/XMOhost26

      交流技术群:https://t.me/owolai007

      http://www.xdnf.cn/news/6566.html

      相关文章:

    1. 怎么使用python进行PostgreSQL 数据库连接?
    2. OpenCV CUDA模块中矩阵操作------分布统计类
    3. RAG数据处理:PDF/HTML
    4. LangFlow技术深度解析:可视化编排LangChain应用的新范式 -(2)流编辑器系统
    5. MySQL 8.0 OCP 1Z0-908 131-140题
    6. 碰一碰发视频工具应用场景解析与 OEM 贴牌部署注意事项
    7. QTreeView设置显示连接线
    8. 【Linux 学习计划】-- 权限
    9. 【控制波形如何COPY并无痛使用】
    10. python中字符串的操作
    11. 电动流量调节 V 型球阀:工业流体控制的理想选择-耀圣
    12. uv python 卸载
    13. python调用金蝶api接口
    14. 分布式锁: Redis和ZooKeeper两种分布式锁对比
    15. 【时空图神经网络 交通】相关模型2:STSGCN | 时空同步图卷积网络 | 空间相关性,时间相关性,空间-时间异质性
    16. Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
    17. 0-INViT:一个具有不变嵌套视图Transformer的可推广路由问题求解器(code)(未完)
    18. 网页工具-OTU/ASV表格物种分类汇总工具
    19. Spyglass:跨时钟域同步(同步使能)
    20. ubuntu22.04卸载vscode
    21. 深度学习中的归一化:提升模型性能的关键因素
    22. Service Mesh
    23. Linux下可执行程序的生成和运行详解(编译链接汇编图解)
    24. 针对大事务问题对业务存储过程改造
    25. TLP5814H是一款高度集成的栅极驱动器光电耦合器
    26. IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?
    27. 文本分类任务Qwen3-0.6B与Bert:实验见解
    28. JavaSwing中的容器之--JScrollPane
    29. C++23:ranges::iota、ranges::shift_left和ranges::shift_right详解
    30. 在 Neo4j 中实现向量化存储:从文本到高效语义搜索