【问题标题】:Calling external services (Rest api)/database CRUD operations within Orleans Grain在 Orleans Grain 中调用外部服务 (Rest api)/数据库 CRUD 操作
【发布时间】:2021-05-30 15:40:31
【问题描述】:

我在我的一个项目中使用了 Orleans 框架。这是我们谷物的调用模式。

Domain Service ->
   Calls CustomerGrain.Save() ->
       Call1 CustomerService.Save (external service) -> Saves customer in sql server
       Call2 ProfileService.Save (external service) -> Saves customer recent activity in sql server
       Call3 Repo.Save ->
              Call1 from Repo.Save - Calls Stored proc 1 to save in sql server
              Call2 from Repo.Save - Calls Stored proc 2 to save in sql server
  1. 所有调用都使用异步代码。
  2. 通常外部服务(使用 HttpClient)或 db 操作调用在所有操作中耗时
  3. SiloMessagingOptions - ResponseTimeout 根据需要增加。

可以在grain内调用外部服务/数据库操作吗?这种调用模式会在高负载期间引起任何问题吗?喜欢

  • Orleans 任务调度程序线程池饥饿?
  • 筒仓消息超时

谢谢 达南杰

【问题讨论】:

    标签: distributed-system orleans


    【解决方案1】:

    这种模式很好:您可以从 Orleans grain 调用外部服务而无需担心。正如您所指出的,无论是否涉及奥尔良,阻塞代码都可能导致 .NET 线程池出现问题。换句话说,相同的代码会导致 ASP.NET 应用程序或任何其他 .NET 应用程序出现问题。 Orleans 使用 .NET 的 ThreadPool 安排所有操作。

    使用task.Wait()task.ResultTask.WaitAll(tasks...)等方法阻塞任务会导致你的grain死锁,因为grain是单线程的,它也会很快导致ThreadPool饿死,所以这是必须避免。

    如果您的 HTTP 调用超过为您的 grain 调用配置的最大响应超时,则会发生消息超时。

    强烈建议对任何在负载下用于生产的代码进行分析,以确定是否存在阻塞代码路径或其他低效问题。如果您需要帮助分析 CPU 分析跟踪,您可以在 Orleans 聊天室或 GitHub discussions 中找到帮助。

    【讨论】:

    • 感谢@Reuben 的回复!我们确实在同一方法中为不同的外部服务调用 + db 调用创建了多个任务。任务正在等待 Task.WhenAll(tasks...) 如下所示: CustomerGrain.Save() Task1 = SaveService1() Task2 = SaveService2() Task3 = SaveToDB() Task.WhenAll(task1, task2, task3);我希望这应该没问题。注意 - 正如您所提到的,我们遇到了 Tasks.WaitAll(tasks...) 的问题并进行了更正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多