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

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

      相关文章:

    1. 综合应急指挥-融合通讯能力概览
    2. Unity雷火UX工具插件中的本地化功能(Unity项目中文字图片多语言功能)
    3. 网页工具-OTU/ASV表格物种分类汇总工具
    4. WEB安全--Java安全--shiro721反序列化漏洞
    5. Mysql数据库详解
    6. 【linux】Web服务—搭建nginx+ssl的加密认证web服务器
    7. PostgreSQL中的全页写
    8. 在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问
    9. 通信安全堡垒:profinet转ethernet ip主网关提升冶炼安全与连接
    10. Jenkins 最佳实践
    11. 探索大型语言模型(LLM)的开源学习路径:mlabonne/llm-course 深度解析
    12. 文本分类任务Qwen3-0.6B与Bert:实验见解
    13. 人工智能100问☞第24问:什么是生成对抗网络(GAN)?
    14. 多模态大语言模型arxiv论文略读(七十九)
    15. C# DataGridView 选中所有复选框
    16. Centos7系统(最小化安装)安装zabbix7版本详细文章、nginx源代码配置、php源代码、mysql-yum安装
    17. CSS面试题汇总
    18. 【Rust闭包】rust语言闭包函数原理用法汇总与应用实战
    19. 微信小程序:封装表格组件并引用
    20. C++之unordered_map/unordered_set模拟实现
    21. 长期吃太饱,身体会发生什么变化?
    22. 人民日报整版聚焦:外贸产品拓内销提速增量,多地加快推动内外贸一体化
    23. 商务部回应稀土出口管制问题
    24. 盛和资源海外找稀土矿提速:拟超7亿元收购匹克,加快推动坦桑尼亚项目
    25. 浙能集团原董事长童亚辉被查,还是杭州市书法家协会主席
    26. 125%→10%、24%税率暂停90天,对美关税开始调整