gpt4 book ai didi

multithreading - 基于流/响应式(Reactive)编程中的事务/请求-响应模式

转载 作者:行者123 更新时间:2023-12-03 12:46:41 24 4
gpt4 key购买 nike

因此,最近几天我一直在阅读有关基于流的编程 (FBP) 的内容,并且我还一直在阅读 J. Paul Morrison 的相关书籍。但是我觉得我仍然无法真正理解它。一般的概念是您将编程视为某种装配线,其中您的组件将一些数据包作为输入并产生一些数据包作为输出。您可以连接这些组件和数据包通过网络传输。虽然我完全明白这如何适用于 ETL 类型的应用程序或批处理,但我不太清楚如何使用它来处理诸如同步请求/响应模式或数据库事务之类的事情。

例如,假设我有一个实现为 FPB 的网络服务器。这个网络服务器有一个 GET/user/{id} 应该返回一个 JSON 与一些关于用户的信息。它还有一个 POST/user/{id} ,您可以在其中通过将一些 JSON 发送回服务器来更新用户。所以这就是我想象的这个流程的样子:

Example Flow

我试图拥有许多可重用的组件,而不是将处理请求的整个逻辑放入单个组件中。因此,有一个 HTTP 服务器组件将请求发送到调度程序组件,然后调度程序组件将请求调度到后续流中。在每个流程中,请求由通用“请求解析器”组件解析,该组件将请求的各个部分输出到流程的其余部分。

上半部分非常简单,我从数据库中读取具有给定 ID 的用户实体,将对象序列化为 JSON,然后将其发回。然而此时我们实际上并没有对 HTTP 请求的引用,所以我怎么知道将这个请求发送到哪里呢?

在下半部分,我们有一些额外的复杂性,因为我想以事务方式写入数据库。因此,首先启动一个事务(并行地将请求主体解析为某个对象),然后从数据库中检索用户对象并将其与请求的输入合并。最后它被写回数据库并提交事务。最后一些“OK”状态被响应给调用者。在这里我有一个额外的问题,即在提交事务时我真的不知道要提交哪个事务。当然,在发送响应时,我不知道将它发送给哪个请求。

所以这两个问题似乎有一些共同点——一种跨越许多组件的“上下文”。在一个示例中,它是 HTTP 请求/响应上下文,在另一个示例中是事务上下文。在常规编程中,这些上下文通常在线程级别处理。由于请求在单个线程中运行,因此事务和请求上下文绑定(bind)到线程本地,因此只要一切都在同一线程中运行,它们就可以在任何地方访问。

在基于流的编程中,每个组件都独立运行,最好在单独的线程上运行。这实际上是一件关键的事情,因为它允许并行化和有效使用多个处理器。然而,当线程本地上下文不再存在时,您如何在基于流的编程中处理这些问题?如果进行适当的错误处理(我在示例中省略了这一点),这会变得更加复杂。

我认为当您进行大多数处理是异步和多线程的响应式(Reactive)编程时,您也会遇到同样的问题,所以我想知道是否有模式可以处理这个问题。您是否有反应式编程或基于流的编程的实际经验,并且对我如何解决这个问题有一些提示?

最佳答案

我在 Twitter 上写了一个快速回答 - 我想我也会把它贴在这里......为重复发布道歉!

我喜欢这个/这些问题的子流,其中子流中的第一个信息包提供了您正在谈论的“上下文”。这可能有帮助:https://github.com/jpaulm/javafbp-websockets ... HTH!

PS 这种循环式网络拓扑结构也是 Facebook 新“Flux”技术的基础 - 请参阅 Jing Chen 的介绍,她将这种方法与 MVC 进行了比较:https://www.youtube.com/watch?v=nYkdrAPrdcw

关于multithreading - 基于流/响应式(Reactive)编程中的事务/请求-响应模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com