- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
Jimmy Boagard 描述了一家麦当劳快餐链式店 here将其与 scatter gather pattern. 进行比较
初步实现思路:
为所有食品站将获得的所有类型的 FoodOrdered 事件提供一个通用接口(interface),然后每个食品站将能够消费/创建其各自的项目并发布一个通用的完成事件。例如:炸薯条和汉堡站收到有关炸薯条订单的消息,炸薯条站消费该订单会宣布 saga 正在监听的 ItemDoneEvent。
最初的担忧:
由于 Saga 不关心完成的食物类型,只关心所有食物都完成这一事实,这似乎是一个OK解决方案。然而在阅读警告后here关于队列共享并注意到 Consumer.Conditional filtering has been removed with MassTransit 3.0感觉好像框架是在用这种方法说“Bad Things(TM) 将会发生”。但是我不确定如果不为厨房中的每个食品创建消息请求和响应以及关联事件,您还会怎么做。例如:FriesOrdered、BurgerOrdered FriesCooked、BurgerCooked。如果你必须为厨房里的每件元素都这样做,那会不会很乏味?
考虑到上述问题 - 这种类型的工作流程的一个好的 saga 示例应该是什么样的?
最佳答案
我遇到了类似的问题 - 需要发布几十个命令(所有相同的界面,IMyRequest
)并等待所有。
实际上,我的命令启动了其他 saga,它在处理结束时发布 IMyRequestDone
,而不标记 saga 已完成。 (需要在稍后的某个时间完成它们。)因此,我没有在父传奇中保存已完成的嵌套传奇的数量,而是查询子传奇实例的状态。
检查每个 MyRequestDone
消息:
Schedule(() => FailSagaOnRequestsTimeout, x => x.CheckToken, x =>
{
// timeout for all requests
x.Delay = TimeSpan.FromMinutes(10);
x.Received = e => e.CorrelateById(context => context.Message.CorrelationId);
});
During(Active,
When(Xxx)
.ThenAsync(async context =>
{
await context.Publish(context => new MyRequestCommand(context.Instance, "foo"));
await context.Publish(context => new MyRequestCommand(context.Instance, "bar"));
context.Instance.WaitingMyResponsesTimeoutedAt = DateTime.UtcNow + FailSagaOnRequestsTimeout.Delay;
context.Instance.WaitingMyResponsesCount = 2;
})
.TransitionTo(WaitingMyResponses)
.Schedule(FailSagaOnRequestsTimeout, context => new FailSagaCommand(context.Instance))
);
During(WaitingMyResponses,
When(MyRequestDone)
.Then(context =>
{
if (context.Instance.WaitingMyResponsesTimeoutedAt < DateTime.UtcNow)
throw new TimeoutException();
})
.If(context =>
{
var db = serviceProvider.GetRequiredService<DbContext>();
var requestsStates = db.MyRequestStates.Where(x => x.ParentSagaId == context.Instance.CorrelationId).Select(x => x.State).ToList();
var allDone = requestsStates.Count == context.Instance.WaitingMyResponsesCount &&
requestsStates.All(x => x != nameof(MyRequestStateMachine.Processing)); // assume 3 states of request - Processing, Done and Failed
return allDone;
}, x => x
.Unschedule(FailSagaOnRequestsTimeout)
.TransitionTo(Active))
)
.Catch<TimeoutException>(x => x.TransitionTo(Failed))
);
During(WaitingMyResponses,
When(FailSagaOnRequestsTimeout.Received)
.TransitionTo(Failed)
定期检查所有请求是否已完成(通过“减少 NServiceBus Saga 负载”):
Schedule(() => CheckAllRequestsDone, x => x.CheckToken, x =>
{
// check interval
x.Delay = TimeSpan.FromSeconds(15);
x.Received = e => e.CorrelateById(context => context.Message.CorrelationId);
});
During(Active,
When(Xxx)
.ThenAsync(async context =>
{
await context.Publish(context => new MyRequestCommand(context.Instance, "foo"));
await context.Publish(context => new MyRequestCommand(context.Instance, "bar"));
context.Instance.WaitingMyResponsesTimeoutedAt = DateTime.UtcNow.AddMinutes(10);
context.Instance.WaitingMyResponsesCount = 2;
})
.TransitionTo(WaitingMyResponses)
.Schedule(CheckAllRequestsDone, context => new CheckAllRequestsDoneCommand(context.Instance))
);
During(WaitingMyResponses,
When(CheckAllRequestsDone.Recieved)
.Then(context =>
{
var db = serviceProvider.GetRequiredService<DbContext>();
var requestsStates = db.MyRequestStates.Where(x => x.ParentSagaId == context.Instance.CorrelationId).Select(x => x.State).ToList();
var allDone = requestsStates.Count == context.Instance.WaitingMyResponsesCount &&
requestsStates.All(x => x != nameof(MyRequestStateMachine.Processing));
if (!allDone)
{
if (context.Instance.WaitingMyResponsesTimeoutedAt < DateTime.UtcNow + CheckAllRequestsDone.Delay)
throw new TimeoutException();
throw new NotAllDoneException();
}
})
.TransitionTo(Active)
.Catch<NotAllDoneException>(x => x.Schedule(CheckAllRequestsDone, context => new CheckAllRequestsDoneCommand(context.Instance)))
.Catch<TimeoutException>(x => x.TransitionTo(Failed));
关于c# - 如何在 MassTransit 3.0 中使用分散/聚集模式实现传奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33579533/
我正在使用 IAmStartedByMessages 开始 nsb 传奇。在处理这个特定消息时,我正在执行某种业务逻辑,如果某些情况失败,我不希望 Saga 被持久化。我怎样才能实现这个目标? 谢谢,
我需要为我的矢量图层创建符号。我的矢量图层有动态样式,我想在 Canvas 或 svg 中创建图例。有谁知道如何根据 ol.style 为我的图例渲染符号? 最佳答案 我们最近在 GeoExt 3 中
据我了解,这三个概念都与长时间运行的事务相关。 据我了解,流程管理器是一个有限状态机,它只是对事件使用react并发出命令。它不包含任何业务逻辑,它只是进行路由。它的目标是让您进入最终状态,您知道您的
我正在尝试复制以下图表 我遇到的问题是如何在每个堆叠的盒子的左侧和中间制作图例(每个盒子中的系列词)。我搜索了 amCharts 但没有运气。有没有办法做到这一点或如何覆盖或扩展 amCharts 以
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
我想创建一个由消息“Event1”开始的传奇,但它会忽略收到具有相同应用 ID 的“重复”开始消息(这可能是由于两个或多个用户在短时间内点击了 UI 按钮) .文档似乎表明这种方法可行: 佐贺声明 I
我试图让图例为循环中绘制的每个项目添加一个条目。因此,“vgs”可能被绘制了 6 次,对于每一次我都想为名称“vgs”添加一个条目以及为“vgs”的特定实例绘制的颜色。我的代码目前似乎为最后一个实例创
我是 React Redux 新手。只是尝试 Redux Saga 并遇到一些我无法理解的错误消息。这是我的 rootSaga: import { takeEvery } from 'redux-sa
我有一个已经调用并且必须等待的 promise 。基本上: const foo = () => Promise.resolve('foo'); // The real promise takes ti
我有一个已经调用并且必须等待的 promise 。基本上: const foo = () => Promise.resolve('foo'); // The real promise takes ti
默认情况下,MATLAB 将图例条目的文本部分放在图中所用内容的样本之后。有什么办法可以扭转这种局面吗?例如,使用下面的代码,图例中的第一个条目是一个深蓝色矩形,后跟文本 I'm;我希望它是相反的(即
我是 python 和 matplotlib 的初学者。我想创建一个带有图例的水平条形图。我的代码: import matplotlib.pyplot as plt plt.rcdefaults()
Epic商城限时免费购买《雷曼:传奇》游戏 需要的上 《雷曼:传奇》是一款动作闯关冒险题材的游戏 截止21/6前 免费购买 活动地址:http://t.cn/Aigo55Nx
我正在尝试使用 redux-saga 编写一个 api。我有这样的 servicesSaga.js import { FETCH_USER } from '../actions/actionTypes
我在基于此 real-world example 的小型项目中使用 Redux/sagas 工作流,但这些逻辑并不那么复杂。我应该如何使用更全面的 API(即 Reddit 的 API)而不会使事情变
我有一个 controller saga,它曾经有一个步骤来启动一个进程,该进程在一个事务中包含 3 个 Action 。我现在正在将这个子流程重构为一个单独的传奇。这样做的结果是,原始 saga 将
我的应用程序有两个部分。它们每个都有自己的 saga 中间件,但两者都不会同时实例化。它总是一个或另一个。例如,一个 saga 处理登录,另一个处理主页。 我想知道在我的应用程序的两个部分之间导航时应
你好 Stack Overflow 社区! 我正在寻找一个好的实践和实现来等待组件中的分派(dispatch)操作。 我知道 React-Native 和 Redux-Saga 只是说:不要等待,让商
传奇新手,我在我的根传奇中使用它: function* rootSaga() { yield [ cycleRoot(), // fetches root cy
我正在使用 Redux Saga 模板,它使用包含 yield call() 实例的生成器函数。基本上看起来像这样: function *a(){ yield call(); } yield ta
我是一名优秀的程序员,十分优秀!