有些人不建议在微服务世界中使用 kafka 来实现请求/响应模式。
但我还不清楚为什么不推荐它?同时,我看到 spring kafka 开箱即用地支持这种模式,而 .net 没有通过任何库(既不通过 confluent kafka 也不通过 MassTransit)开箱即用地提供此功能。如果不推荐通过 kafka,我们是否有任何其他标准方法可以通过 .net 核心实现这种情况。有人可以为我提供一个合理的技术答案来说服自己吗?
更新
我正在编辑我的问题以解释业务用例假设我需要显示我的帐户余额。我从前端向api控制器发出请求[http请求],然后会触发三个事件来获取储蓄账户余额/固定账户余额/活期账户余额。
这些事件将发布到三个 kafka 主题,然后由三个消费者监听。这些消费者分别处理请求并发布到另外三个主题。将等待初始 http 调用,直到这些主题被消耗。一旦它被消耗 http 调用响应前端。
[HttpPost]
[Route("ResponseWhenAny")]
public async Task<string> AggregateResponseWhenAny([FromBody] string value, string correlationId)
{
string resultOne = "No-Message";
string resultTwo = "No-Message";
correlationId=(string.IsNullOrEmpty(correlationId)) ? Guid.NewGuid().ToString() : correlationId;
var resultOneTask = RequetOne(value, correlationId);
var resultTwoTask = RequetSecond(value, correlationId);
var requestResponseTasks = new List<Task> { resultOneTask, resultTwoTask };
while (requestResponseTasks.Count > 0)
{
Task finishedTask = await Task.WhenAny(requestResponseTasks);
if (finishedTask == resultOneTask && resultOne == "No-Message")
{
Console.WriteLine("First response Received....");
resultOne = await resultOneTask;
}
else if (finishedTask == resultTwoTask && resultTwo == "No-Message")
{
Console.WriteLine("Second response Received....");
resultTwo = await resultTwoTask;
}
requestResponseTasks.Remove(finishedTask);
}
string newResponse = resultOne + resultTwo;
return newResponse;
}
应该等待 resultOneTask 和 resultTwoTask 直到响应主题被消耗。如果 resultOneTask 和 resultTwoTask 是 http 调用,则没有实现它的问题。此用例甚至还支持 RMQ。但我无法找到任何使用 confluent kafka 或 MassTransit for kafka 的标准实现。
提前致谢