0

考虑到服务器负载(Mercure Hub)有什么更好的解决方案?

  1. 用户订阅一个通用主题,以便美居通过这个主题向所有人推送信息,并根据发送数据中的某种 ID,用户端点决定是否对其进行处理。
  2. 或者更好的解决方案是为应用程序中的每个元素设置独特的主题?以便 Mercure Hub 处理有关这一特定主题的数据并将其推送到一定数量的客户端端点?
4

1 回答 1

1

这取决于您是要发布私人(授权)还是公共更新。在我看来,当一切都公开时,选项 2 是最好的,因为您可以在 JWT 中添加通配符,例如:

{
    "mercure": {
        "subscribe": ["*"]
    }
}

但是当使用私有(授权)模式时,你不能在 JWT 中指定用户可以访问的每个资源,因为这需要大量的数据库查询,并且你的 JWT 可能会变得太大。

所以我要做的是以下内容;
将用户资源作为 URL 模板放入 JWT 中,例如:

{
    "mercure": {
        "subscribe": ["/api/users/123/{?}"]
    }
}

{?}手段匹配任何东西。所以/api/blogs/1不匹配,但匹配/api/users/123/blogs/1
现在您只需将更新分派到正确的主题,这可以通过使用$blog->getSharedUsers()例如循环它并创建主题来完成,例如:

$topics = [];
foreach ($blog->getSharedUsers() as $user) {
    $topics[] = "/api/users/{$user->getId()}/blogs/{$blog->getId()}";  
}

我希望这会有所帮助,这就是我在我的一个 SaaS 应用程序中所做的。
如果您还有其他问题,请随时提出,乐于提供帮助!

于 2021-09-02T20:09:15.017 回答