【问题标题】:request - response strategy through Messaging System (kafka/.NET)请求 - 通过消息系统(kafka/.NET)的响应策略
【发布时间】:2018-05-11 22:26:58
【问题描述】:

我正在将分布式架构从 Python 迁移到 .NetCore。此架构具有将请求推送到服务总线 (KAFKA) 的网关 API。请求由微服务处理。这些微服务在请求对象中设置的主题上回答网关(然后是客户端)。 主题名是根据python应用程序的process_id构建的(Flask/uwsgi)。

但是对于 .NetCore Webapi 应用程序,我找不到从其进程中获取“主题”的方法(我从 .NetCore 开始)。使用 Async 方法在等待微服务应答时释放入口点,最好是根据 Assembly ID 的种类生成主题名称。但是每个 Asyc 方法调用都会产生不同的主题,对吧?这会引发大量话题……有点奇怪……

您还有其他方法可以继续吗?

我正在考虑使用 MemoryCache 来包装来自微服务和网关进程的答案之间的通信。 (请求将包含一个 Guid,用作内存缓存访问的键)。你怎么看?

【问题讨论】:

  • 为什么不继续使用进程ID呢? Process p = System.Diagnostics.Process.GetCurrentProcess();p.Id.ToString();
  • 我不知道 .NET 中的“任务”和异步函数是如何处理的。对 python 和进程标识符的兴趣是(在我看来),一旦启动,进程 ID 就永远不会改变。那么单个进程总是只能管理一个Topic。在 .NET 中,我猜想调用潜在的await FetchClientResponseAsync() 会生成一个新进程,从而引出一个新主题。多重访问会导致很多很多的主题,我觉得不太舒服(可读性,主题只用于很少的 1 条消息......)

标签: python asp.net-core apache-kafka memorycache


【解决方案1】:

此代码输出相同的数字,因此任务确实继承了主进程的 process_id。 thread_id 可能不同。

您也可以考虑使用 GUID,而不是 process_id。只是一个想法。

using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class s
    {
        public s() { }
        static void Main(string[] args)
        {
        Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Id);
        Task.Run(async () => { bool x = await Go(); }).GetAwaiter().GetResult(); ;
        }  

        private static Task<bool> Go()
        {
        Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Id);
        return Task.FromResult<bool>(false);
        }
   }
}

【讨论】:

  • 嗯,好的,谢谢。然后,您是否同意收集来自一个“异步”任务的答案,允许我的 web 应用程序接收和管理另一个客户端请求,可能导致再次联系服务并进入类似的接收响应循环?这样,我将有两个任务等待对同一主题的相同类型的响应,从而导致潜在的损坏?
  • 另外,Guid 生成唯一值,对吗?这将有助于每个任务收集其私人响应。这样会更好,即使结果会引发大量话题……
  • 基于我对您的应用程序的有限了解,是的,我可以看到两个任务在等待同一个主题(process_id)。据说 GUID 是全球唯一的。 global 的范围非常广泛,但在您的应用程序中它们肯定是独一无二的。
猜你喜欢
  • 2016-06-02
  • 2019-11-18
  • 2021-05-05
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2019-04-18
相关资源
最近更新 更多