草庐IT

Php , laravel, socket - 水平缩放技术

coder 2023-07-18 原文

我有一个 laravel 应用程序,我在其中使用 php ratchet 库在客户端和用户之间建立持久连接以进行实时通信(目前它只是一种方式,即,只有服务器可以发送消息到客户)。

有了这个架构,我如何拥有多个这样的 laravel 服务器,每个服务器都有自己的一组连接到它们的客户端,以便相互通信?

我正在考虑使用 REDIS 并拥有一个 redis 服务器,我的所有节点都将连接到该服务器(使用 pub sub)。

我的服务类似于群发消息应用程序(一个用户有很多组,一个组有很多用户),到目前为止(现在我只有一个服务器,没有 redis),我得到了所有用户的组,并为他订阅这些主题(主题名称类似于 GROUP_ 1、GROUP_ 8、GROUP_ 99 等)。

我想知道每个节点如何订阅 redis 中的特定主题(将所有 redis 消息发送到我的所有节点是没有意义的)。

Laravel 的示例说要像这样使用 php artisan 命令:

class RedisSubscribe extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe to a Redis channel';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        Redis::subscribe(['test-channel'], function($message) {
            echo $message;
        });
    }
}

但是,我希望能够在运行时(运行 artisan 命令后)订阅、取消订阅某些主题。我怎样才能在 Laravel 中做到这一点?

最佳答案

  1. 因此,如果我完全理解您的问题,那么您正在寻找一种方法来向连接在多个 WebsocketServer 上的用户发送消息。

  2. 并且您不希望将其发送到没有订阅接收主题/ channel 的客户端的 websocketservers。


第 1 部分答案:

我目前还在大约 50 个不同的 websocketServer 上执行此操作,因此这是一个功能性设计。 我将所有 50 个 websocketservers 的 IP 地址存储在我的数据库中。 我还为每个 websocketservers 附加了 8096 个用户的限制。

发布/订阅部分

对于每个想要连接的用户,我首先调用 API 来确定用户必须连接到哪个 websocket。这是为了让一台服务器没有 8k 用户而其他服务器为空。实现此目的的另一种方法是使用负载平衡并在负载平衡器后面连接所有不同的 websocket 服务器。

完成后,我总是将用户连接到哪个 websocketserver 保存在我的数据库中。如果用户还订阅了 channel ,则会在数据库中添加一个新条目。

当用户取消订阅某个主题/ channel 时,该 channel 的用户条目将从数据库中删除。

发送消息

为了向不同的用户发送消息,我目前也在使用 API,因为我只使用从服务器到客户端的 websocket,而不是相反。

在用户向其他人发送消息时,API 调用还会注意到我正在运行的推送服务器。推送服务器也连接到数据库。

对于推送服务器收到的每条消息,它会及时了解哪些用户订阅了该 channel /主题。

然后它只会将数据发送到具有订阅了您正在寻址的 channel /主题的连接/用户的 websockets。


第 2 部分答案

它有点像以前的答案,但它的重点是只将数据发送到具有监听客户端的 websockets。此信息是从数据库中获取的。

我目前针对这个问题的类似数据库的方案(只包括其中的重要部分。

模板: 表格(第 1 列,第 2 列);

  • 用户(用户 ID);
  • Websocket(websocketId, IP 地址, userLimit);
  • 连接(connectionId, user.userId, websocket.websocketId);
  • 订阅(connection.connectionId, channelId);

如果您需要更多信息,请告诉我。

关于Php , laravel, socket - 水平缩放技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37991178/

有关Php , laravel, socket - 水平缩放技术的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  4. ruby-on-rails - 用于门户的 Ruby 技术 - 2

    我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它

  5. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  7. ruby-on-rails - Ruby on Rails 中的水平数据库扩展 - 2

    我有一个RubyonRails应用程序和一个具有以下结构的PostgreSQL数据库:classA只有几个A,而且增长缓慢(比如一个月5个)。每个A有数千个B,每个B有数万个C(因此每个A有数百万个C)。A是独立的,并且永远不会同时需要来自不同A的B和C(即在同一查询中)。我的问题是现在我只有几个A,ActiveRecord查询需要很长时间。当C的表有数千万行时,查询将永远无法进行。我正在考虑水平扩展数据库(即A的一张表,B的一张表和每个A的一张C的表)。但我不知道该怎么做。我猜这是一种分片,但我无法弄清楚如何动态创建数据库表并使用ActiveRecord访问数据(如果该表取决于我正在

  8. ruby - 使用哪种群发消息技术? - 2

    我感到有点困惑——大约24小时以来,我一直在考虑在我的项目中使用哪种组播技术。基本上,我需要的是:创建组(通过一些后端进程)任意客户端广播消息(1:N,N:N)(可能)直接消息(1:1)(重要)使用我自己的后端(例如,通过某种HTTPAPI)对客户端进行身份验证/授权能够通过后端进程(或服务器插件)踢出特定的客户端这是我要的:Ruby或Haxe中的后端相关流程JS+Haxe(Flash9)中的前端—在浏览器中,因此理想情况下通过80/443进行通信,但不一定。因此,这项技术必须能够在HaxeforFlash中轻松访问,最好是Ruby。我一直在考虑:RabbitMQ(或OpenAMQ)、

  9. 企业大数据发展面临问题之存算分离技术思考 - 2

    文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据

  10. 已解决socket.timeout : The read operation timed out - 2

    已解决(pip安装模块超时,利用四种国内镜像源完美解决)WARENTING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby‘ConnectTimeoutError(pip._vendor.urllib3.connection.HTTPSConnectionobjectatOx00001D6OE4F4A940>,‘Connectiontopypi.orgtimedout.(connecttimeout=15)’)’':/simple/pip/socke

随机推荐