我一直在研究一个基于消息传递启动一些辅助角色的应用程序。
这是我希望应用程序工作的方式:
Client sends a request for work (RPC).
One of the worker roles accepts the work, generates a random id, and responds to the RPC with the new id.
The worker will post its debug logs on a log channel with the id.
The client will subscribe to this channel so users can see what's going on.
RPC工作正常,但我似乎无法弄清楚如何实现日志发送。
这是接受工作的代码(简化)
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://xxxxxx.nl"), h =>
{
h.Username("xxx");
h.Password("xxxx");
});
sbc.ReceiveEndpoint(host, "post_work_item", e =>
{
e.Consumer<CreateWorkItemCommand>();
});
sbc.ReceiveEndpoint(host, "list_work_items", e =>
{
e.Consumer<ListWorkItemsCommand>();
});
});
CreateWorkItemCommand
将创建线程,完成工作等。现在,我将如何使用Masstransit实现日志发送?我想的是:
bus.Publish(
obj: WorkUpdate{ Message = "Hello world!" },
channel: $"work/{work_id}"
)
客户会做一些事情:
bus.ReceiveFromEvented($"work/{rpc.work_id}").OnMessage += { more_psuedo_code() }
我似乎无法找到如何做到这一点。
任何人都可以帮助我吗?
谢谢!
答案 0 :(得分:1)
它看起来像 saga 和投票率。 Current Turnout实现正在监视作业本身,我怀疑你是否真的可以订阅该消息流。它仍然没有真正完成。
你可以使用传奇来解决这个问题。一些外部触发器(一个命令)将启动第一个saga,它将使用Request / Response启动进程,这将完成工作,并获得其相关ID(作业ID)。长作业可以使用相同的相关ID发布进度报告,并且saga将使用它们,执行它需要做的事情。
"work/{rpc.work_id}"
将被相关性替换。