0

有些人不建议在微服务世界中使用 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 的标准实现。

提前致谢

4

1 回答 1

0

通常不需要消息队列和/或事件流平台来实现请求/响应,只会使架构复杂化。

公开和调用 http 端点(在 .Net 中通常称为 WebAPI)是一个更简单的解决方案。

于 2021-09-27T16:20:23.077 回答