首页 > 其他分享 >在分布式系统中使用异步管道创建实体

在分布式系统中使用异步管道创建实体

时间:2024-10-23 17:44:28浏览次数:6  
标签:异步 创建 实体 系统 任务 管道 分布式系统

image

背景

    在分布式系统中异步创建实体既是挑战也是优势,尤其是对于追求可扩展性、容错性和高效用户体验的大型企业而言。用于创建实体的异步(async)管道可以解耦服务、优雅地处理故障并最大限度地减少延迟。这些特性使企业能够在扩展过程中保持灵活、高性能的系统。让我们深入探讨构建有效管道的优势、挑战和解决方案。


实体创建中异步管道的优势


优雅的故障处理
在复杂的分布式系统中,实体创建过程中的某些任务并不重要。异步管道允许故障隔离,这意味着非关键任务的故障不会中断整个流程。这些任务既可以重试,也可以忽略,从而使流水线顺利进行。

减少延迟和并行性
通过解耦高延迟任务,异步管道可确保其他任务无需等待即可继续执行。这种并行性缩短了实体创建的总体时间,尤其是当不相互依赖的任务可以同时执行时,吞吐量和响应速度都会得到提高。

独立性和可扩展性
异步管道可让不同的服务独立工作,并根据需要进行扩展。例如,处理通知的服务可能与核心实体创建服务有不同的扩展需求。由于服务是松散耦合的,因此可以在不中断管道的情况下对其进行更换、更新或扩展,从而增强系统的弹性。

提高容错性和最终一致性
异步管道允许在服务停机或延迟时自动重试。虽然某些任务可能需要更长的时间,但系统可确保最终的一致性,保证跨服务的数据即使暂时不同步,最终也会同步。

无阻塞操作
使用异步系统,服务可以在不等待其他服务响应的情况下继续运行,从而提高资源利用率和系统响应速度。这种非阻塞特性允许多个任务并行运行,从而提高了系统的整体吞吐量。

松耦合和灵活性
服务间的异步通信促进了松耦合架构,不同的服务通过事件流或消息队列进行交互。这种分离实现了独立更新或替换,使大型企业能够管理复杂的架构并采用持续部署策略。

响应式前端体验
异步管道允许前端应用程序向用户提供即时反馈,即使后端流程需要时间才能完成。具体做法是,在后端执行繁重任务时,通知用户实体创建正在进行中。实时用户通知可确保流畅、响应迅速的用户体验。

事件驱动架构
异步管道在事件驱动架构中表现出色,在这种架构中,某些任务(如通知或更新)由特定事件触发。这些架构能有效处理大量事件,同时保持系统的响应速度。

支持微服务和服务专业化
在基于微服务的体系结构中,每个服务都是独立管理的,异步管道允许服务专门处理验证或日志记录等任务,而无需依赖其他服务。这种专业化提高了性能,简化了大规模维护。

实体创建中的异步管道挑战


虽然异步管道具有显著的优势,但也存在一系列挑战:

最终一致性
分布式系统依赖于最终一致性,这可能会导致服务之间出现暂时的不一致。一些服务可能会识别创建的实体,而另一些服务则不会。在各系统间保持同步数据,尤其是在实体创建过程中,就成了一个挑战。

错误处理和重试
管道的任何步骤都可能发生故障。错误处理需要重试和惰性等机制,以避免数据重复或损坏。识别故障点并确保从部分成功中优雅地恢复对系统可靠性至关重要。

竞赛条件
当多个服务异步工作时,可能会出现竞赛条件。例如,如果一个服务假定某个实体已经完全创建,那么它可能会对不完整的数据采取行动。要避免此类问题,服务间的有效协调和协调是必不可少的。

延迟和性能
由于分布式服务之间的通信,异步管道可能会引入延迟。如果实体创建过程中的任何一步出现延迟,整个操作的速度就会减慢。这在用户等待实时响应时尤其容易出现问题。

监控和可观察性
跟踪异步操作的状态比同步系统更难。适当的日志记录、监控和可观察性对于发现问题和排除故障至关重要,但这些功能通常在异步管道中更难实现。

依赖实体的协调
当一个实体依赖于另一个实体的成功创建时,异步协调就会变得复杂。协调失败会导致依赖关系中断或死锁。

模式错配和演变
模式的更改会破坏异步管道,尤其是在不保持向后兼容性的情况下。回滚模式变更会导致服务间数据不一致。

使用异步管道创建实体的实用解决方案


为了应对异步管道的挑战,我们可以通过以下步骤实现弹性架构:

image

同步创建主标识符
实体创建过程从同步创建主标识符开始,主标识符是其余操作的基础。在整个过程完成之前,实体在数据库中会被标记为 “未准备好使用”。这样可以确保用户不会看到不完整的数据。

实体完成的异步管道
创建主标识符后,其他任务(如填充不同的数据存储)将以异步方式处理。每个任务都会引用主标识符,确保整个管道的一致性。

协调层
利用
Temporal 等协调平台,系统可以管理任务执行、重试和状态跟踪。在将实体标记为 “可用于消费 ”之前,协调层会监听所有任务的成功完成。

实体状态管理
实施多种状态,如 “待创建”、“出错 ”和 “可使用”。这样可以改进跟踪,并通过通知或电子邮件更新为用户提供及时反馈。

日志和可观察性
全面的日志记录对于诊断问题和跟踪管道健康状况至关重要。应使用可观察性工具来监控异步操作的状态,并深入了解系统瓶颈。

临时数据存储
临时存储层可以在管道开始时存储原始数据 Blob。这样就能进行数据恢复和任务重试,而不会在服务故障时损坏或丢失信息。

用户互动和反馈
通过响应式界面向用户提供实时反馈对用户体验至关重要。实施通知或用户界面元素等机制,允许用户刷新和检查实体创建请求的状态。


系统架构解读

  1. 客户端(Client)

    • 初始点,负责发送原始数据(raw blob)。
  2. 临时存储(Temporary Storage)

    • 临时存储接收客户端发送的原始数据。
    • 在消息队列处理失败时,可以重新获取原始数据。
  3. 消息队列(Message Queue)

    • 异步处理机制,用于排队消息。
    • 触发异步任务,并将主标识符(Primary Identifier)传递给任务。
  4. 异步任务(Async Tasks)

    • 包括多个异步任务(Async Task 1至4)。
    • 这些任务可能执行不同的处理流程,如数据清洗、验证、转换等。
    • 任务完成后,会返回一个完成信号。
  5. 实体生成(Entity Generation)

    • 负责生成或获取实体的唯一标识符(ID)。
    • 更新实体状态为“就绪(ready)”。
  6. 数据存储(Datastore)

    • 存储实体的ID和元数据。
    • 更新实体状态为“就绪”。
  7. 主API(Primary API)

    • 负责存储ID和元数据。
    • 更新实体状态为“就绪”。
    • 获取只有“就绪”状态的实体。
系统架构设计特点:
  • 异步处理:通过消息队列和异步任务处理,系统可以非阻塞地处理大量数据,提高吞吐量。
  • 容错性:临时存储可以在消息队列处理失败时重新获取数据,增强了系统的容错能力。
  • 解耦合:各个组件之间通过消息队列和API进行通信,减少了直接依赖,提高了系统的灵活性和可维护性。
  • 可扩展性:异步任务可以根据需要增加或减少,以适应不同的负载。
  • 状态管理:通过实体状态的更新,系统可以跟踪数据的处理进度。
可能的应用场景:
  • 大数据处理:适用于需要处理大量数据的场景,如日志分析、事件跟踪等。
  • 微服务架构:在微服务架构中,各个服务可以通过消息队列进行通信,实现服务间的解耦。
  • 任务队列管理:适用于需要排队和异步处理任务的场景,如电子邮件发送、文件处理等。
  • 数据集成:在数据集成过程中,可以将来自不同源的数据进行清洗、转换,并存储到统一的数据存储中。

这个系统架构设计适用于需要高吞吐量、高可用性和可扩展性的场景。通过异步处理和状态管理,系统可以有效地处理大量数据,同时保持数据的一致性和完整性。


优点

  1. 高吞吐量:异步处理机制可以提高系统的处理能力,允许系统在不阻塞主线程的情况下处理大量数据。

  2. 可扩展性:系统可以通过增加更多的异步任务处理器来应对增加的工作负载,使得系统易于扩展。

  3. 容错性:通过临时存储和消息队列,系统可以在处理过程中出现故障时重新尝试,从而提高系统的稳定性。

  4. 解耦合:组件之间的通信通过消息队列和API进行,减少了组件之间的直接依赖,使得系统更易于维护和升级。

  5. 灵活性:异步任务可以根据需要进行调整,不同的任务可以并行执行,提高了系统的灵活性。

  6. 状态跟踪:通过实体状态的管理,可以跟踪数据的处理进度,便于监控和调试。

  7. 负载均衡:异步任务可以在多个处理器之间分配,实现负载均衡,提高资源利用率。

缺点

  1. 复杂性:引入异步处理和消息队列会增加系统的复杂性,需要更多的设计和维护工作。

  2. 调试困难:由于系统的异步性质,调试和跟踪问题可能会更加困难,尤其是在分布式环境中。

  3. 消息队列的瓶颈:如果消息队列成为系统的瓶颈,可能会限制整体性能。

  4. 数据一致性问题:在分布式系统中,确保数据的一致性是一个挑战,尤其是在多个异步任务并行处理数据时。

  5. 延迟问题:虽然异步处理可以提高吞吐量,但在某些情况下,它可能会导致处理延迟,特别是当任务队列很长时。

  6. 资源管理:需要有效的资源管理策略来确保系统在高负载下仍然能够稳定运行,这可能需要额外的监控和自动化工具。

  7. 依赖外部系统:系统的性能和稳定性可能依赖于外部的消息队列和数据存储系统,这可能引入额外的风险。

  8. 事务管理:在涉及多个异步任务和数据更新时,事务管理可能变得复杂,需要额外的机制来保证操作的原子性。


结论


     用于实体创建的异步管道为大型企业提供了强大的优势,提高了可扩展性、弹性和用户体验。但是,它们也面临着与数据一致性、错误处理和延迟相关的挑战。通过采用具有同步标识符创建步骤、协调层和仔细监控的结构化方法,企业可以克服这些挑战,构建可扩展且可靠的系统。这个系统架构设计适用于需要高吞吐量、高可用性和可扩展性的场景。通过异步处理和状态管理,系统可以有效地处理大量数据,同时保持数据的一致性和完整性。这个架构在提高系统性能和可扩展性方面有很多优点,但也带来了一定的复杂性和潜在的挑战。在实际应用中,需要根据具体的业务需求和资源情况来权衡这些优缺点。


今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管理,信息安全,团队建设 有参考作用 , 您可能感兴趣的文章:
构建创业公司突击小团队
国际化环境下系统架构演化
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变

如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

image_thumb2_thumb_thumb_thumb_thumb[1]

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 该文章也同时发布在我的独立博客中-Petter Liu Blog。

标签:异步,创建,实体,系统,任务,管道,分布式系统
From: https://www.cnblogs.com/wintersun/p/18497934

相关文章

  • Springboot异步事件配置和使用
    Spring中提供了完整的事件处理机制,本身底层内置实现了一些事件和监听,同时支持开发者扩展自己的事件和监听实现。一般这种基于事件的实现在项目实际开发中我们主要用来解耦,和做异步处理(默认是同步),提供应用的响应速度。核心架构先简要看一下,在Spring中要实现自定义事件监听需要......
  • OpenSSL异步模式流程梳理
    源码来源于OpenSSLMasterCommitIDd550d2aae531c6fa2e10b1a30d2acdf373663889。总览核心入口函数为ssl_start_async_job,以SSL_do_handshake为入口举例分析,同时通过标注步骤【1~N】,来明确阅读的顺序。步骤【1】到步骤【18】为一个阶段步骤【19】到步骤【23】为一个阶......
  • 隨筆 Kafka 异步发送机制解析
    Kafka异步发送机制解析与比喻        Kafka是一个高效的分布式消息系统,异步发送是其实现高吞吐量和低延迟的关键机制之一。为了更好地理解Kafka生产者的异步发送过程,我们将其比作一个旅客乘飞机前往目的地的故事。在这个故事中,生产者就像一个机场,负责将旅客(数据)送......
  • 异步函数 async function
    ◼async关键字用于声明一个异步函数:async是asynchronous单词的缩写,异步、非同步;sync是synchronous单词的缩写,同步、同时;◼async异步函数可以有很多中写法asyncfunctionfoo(){}constfoo1=asyncfunction(){}constfoo2=async()=>{}classPerson{asyncfoo......
  • 【Linux从入门到精通四】基础命令详解:cd、pwd、mkdir、文件操作与管道符
    个人名片......
  • 回调方式和异步方式的优缺点
    IC卡读卡器web插件目前提供2种接口调用方式,一种直接调用,使用回调函数返回数据。另外一种采用异步await调用,直接返回数据。这两种方式都有自己的优势,回调方式适合自动寻卡或者自动读取IC卡数据,刷卡自动就能返回数据,web页面只需要等待数据即可。异步调用方式更适合一系列的......
  • java线程异步方法
    异步的八种实现方式:线程异步Thread/RunnableFuture+Callable异步框架CompletableFutureSpring注解@AsyncSpringApplicationEvent事件第三方异步框架,比如Hutool的ThreadUtilGuava异步消息队列1、线程异步publicclassThreadTestimplementsRunnable{......
  • 在K8S中,有家拥有分布式系统的跨国公司,拥有大量数据中心,虚拟机和许多从事各种任务的员
    对于拥有分布式系统的跨国公司,且该公司拥有大量数据中心、虚拟机以及众多从事各种任务的员工,采用Kubernetes(K8s)来管理所有任务是一种高效且灵活的方式。以下是一些建议,说明该公司如何以与Kubernetes一致的方式管理所有任务:1.利用Kubernetes的容器化特性容器化应用程序:将公司......
  • 单元化架构,分布式系统的新王!
    0关键收获单元化架构通过减少故障的爆炸半径来增加系统弹性单元化架构是那些任何停机时间都被认为是不可接受的,或者可以显著影响最终用户的系统的一个好选择单元化架构通过强制使用固定大小的单元作为部署单元,并倾向于扩展而不是扩展的方法,增强了微服务的可伸缩性模型单元化......
  • STA模型、同步上下文和多线程、异步调度
    写过任何桌面应用,尤其是WinForm的朋友们应该见过,Main函数上放置了一个[STAThread]的Attribute。而且几乎所有的桌面应用框架,都是由同一个UI线程来执行渲染操作的,这表现为从其他线程修改控件的值就会抛异常:awaitTask.Run(()=>control.Content="");//throwsexception大家......