- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑一个 Web 应用程序,它实现了除查询(即添加、更新、删除)之外的每个数据库操作作为 NServiceBus 消息,这样每当用户调用 Web API 时,在后端它都会被映射到 await endpointInstance.Request
方法在同一 HTTP 请求连接中返回响应。
挑战在于当消息处理程序需要发送一些其他消息并等待它们的响应以完成其工作时。 NServiceBus 不允许调用 Request
在消息处理程序中。
我最终使用 Saga 来实现依赖于其他消息处理程序响应的消息处理程序。但是 Saga 的问题是我无法在同一个 HTTP 请求中发回结果,因为 Saga 使用发布/订阅模式。
我们所有的 web API 都需要在同一个 HTTP 请求中响应(连接应保持打开状态,直到收到结果或发生超时异常)。是否有任何干净的解决方案(最好不使用 Saga)?
示例场景:
await endpointInstance.Request<PurchaseResult>(new PurchaseMessage(itemId, paymentId));
PurchaseMessage
处理程序应调用 await endpointInstance.Request<AddPaymentResult>(new AddPaymentMessage(paymentId));
AddPaymentResult
成功,将购买详情存入数据库并返回true
作为PurchaseResult
, 否则返回 false
最佳答案
您正试图实现我们(在 Particular Software)正试图积极阻止的事情。让我解释一下。
通过远程过程调用 (RPC),您可以在进程外调用另一个组件。那是什么使过程调用“远程”。在使用常规编程的情况下,您可以在进程中完成所有操作,而且速度非常快,而使用 RPC,您需要承担序列化、延迟等方面的开销。基本上,你必须处理 the fallacies of distributed computing .
尽管如此,人们还是出于各种原因这样做。有时是因为您想使用 WebAPI(或“老式”Web 服务),因为它提供了您不想开发的功能。书中最古老的例子是通过邮政编码搜索地址。或者从某人的银行账户中扣款。如果您正在构建 CRM,则可以使用这些远程组件。现在很多人构建分布式单体,因为他们在 session 上被告知这是一件好事。在架构图中,它看起来非常好,但仍然存在时间耦合,这会带来很多麻烦。
其中一些令人头疼的问题是您试图以原子操作执行某些操作。过去,通过进程内调用代码/类/等,这既简单又快速。直到您遇到限制,例如数据库上的大量锁。
对此的解决方案是异步通信。您通过即发即弃方式发送一些信息。这解决了时间耦合。与其拥有一个收到数十个更新数据等请求的数据库,不如让您的网站逐渐停止运行,您可以通过多种选择来确保这种情况不会发生。这真是一件好事,因为您拥有各种更小的操作和许多分布式工作、扩展系统等方式,而不是单个原子操作。
它也带来了额外的挑战,因为不是每个人都能使用即发即弃的方式工作。一些已经构建的系统尝试通过消息传递(希望是 NServiceBus)引入异步通信。有些部分可以完美地工作。但其他部分不能。主要是用户界面(UI)。因为它是为了立即获得结果而构建的。因此,当您从 UI 发送消息时,您会期待一个结果!
通过 NServiceBus,我们构建了一个名为“客户端回调”的包,使这成为可能。我们强烈建议我们的客户不要使用它,除了我刚才描述的这个特定场景。迁移整个 UI 以应对您没有立即收到答复这一事实要好得多,但我们知道这是一项艰巨的工作,没有多少人能够做到这一点。
然而,一旦发送了第一条消息并且 UI 收到了结果,就没有必要再使用回调了。因此,我想提出这种情况:
await endpointInstance.Request<PurchaseResult>();
PurchaseMessage
处理程序检索它需要的信息并将消息发送或发布到(一个)其他组件,然后用答案回复到网络服务器。如果您需要更多信息,请告诉我们。您可以随时通过发送电子邮件至 support@particular.net 与我们联系
关于c# - 将 NServiceBus Saga 作为单个可等待的请求-响应调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53696147/
有什么方法可以将来自 node_modules 的 sagas 与我为我的应用程序编写的其他 sagas 结合起来吗?如果 sagaMiddleware.run() 接受 sagas 数组,但 id
我熟悉redux-thunk,今天来redux-saga,我知道当我们要处理异步的时候,redux-saga需要先调用一个actions作为signal,然后sagas来处理,返回成功/失败操作,所以
如果我有两个 sagas 在同一 Action 上等待 yield take(),是否可以保证哪个 saga 将首先选择该 Action 并执行其剩余逻辑或者是随机的?我需要确保第一个传奇在第二个传奇
我一直在关注 AxonBank example为了理解 Axon 框架中 Saga 的实现,并有一些像这样的代码来开始和结束 saga @Saga public class MoneyTransfer
我有一个基本的传奇,如下所示: const mySaga = function* () { yield takeEvery("SOME_ACTION_REQUEST", function* (
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在开发一个使用 redux-saga 的项目管理来自 API 调用的状态更改。 我看过很多关于如何对传奇进行单元测试的例子,但很少有例子可以用来实际进行集成测试。我们正在使用 jest对于断言。
我有下一个代码: const sagaMiddleware = createSagaMiddleware(options); . . . const createdStore = createStor
当调度一个 Action 时,它到达 reducer 和传奇的顺序是否得到保证? 我可以信赖它 首先进入reducer 那么传奇呢? reducer : function reducer(state
我们的应用程序使用尝试 - 成功 - 失败的方法来处理来自服务器的响应。 我有一个生成器函数,需要像这样运行: function * getSingleSectorAttempt(action) {
当它在屏幕上可见时,我正在记录横幅展示次数。 当用户滚动时,同一条横幅可以在短时间内多次显示。 我想防止这种情况发生。 乍一看,throttle是防止它的完美方法。 但是,当您在一页中有多个横幅时,t
我在 containers/App/sagas.js 中有一个 sagas.js,它包含一个登录 saga,我试图从一个登录弹出窗口调用它,它也有自己的 sagas.js (components/Lo
我有一个 Saga,我需要在其中执行 3 个异步请求,然后在后续请求中使用这 3 个请求的响应。这里有一些伪代码来解释: function* useOtherActionsAndSagas(actio
所以,我是 react 样板的新手,似乎没有办法在不影响前一个传奇的功能的情况下包含另一个传奇(即它不起作用)。 我尝试将 sagas 声明为常量,然后将其传递到容器末尾的 compose 函数中,但
我有以下情况: export function* addCircle(circleApi, { payload }) { try { const response = yiel
以前也有人问过类似的问题,但答案对我没有任何帮助。 What are selectors in redux? How to get something from the state / store i
我有一个运行良好的传奇,我调用一个操作并包含一些数据,传奇被触发,它从操作中提取值,执行API调用并以几个yield put结束 - 太棒了。 我现在正在尝试测试该传奇并解决问题,我已经编写了一个简单
我使用 redux-saga 的主要原因之一是它进行异步函数调用的可测试性。我的困境是,当我使用不属于我的 redux 存储的有状态对象进行编程时,使用 sagas 进行编程变得非常尴尬。是否有使用非
我是传奇世界的新手。虽然我在 react-native 领域使用过 thunk,但此刻我很困惑。我正在努力让我的项目的骨架继续运行,我希望它很快就会变得非常大。考虑到这一点,我试图将逻辑分成多个文件。
我正在使用 saga eventChannel 来监听正在触发的事件(可能是实际应用程序中的 WebSocket),然后我正在更新我的 Redux Store。在组件中,我正在调用 API 操作。然后
我是一名优秀的程序员,十分优秀!