代码之家  ›  专栏  ›  技术社区  ›  Meathanjay

从多台服务器处理Laravel/Redis作业

  •  3
  • Meathanjay  · 技术社区  · 7 年前

    我们正在Laravel上构建一个报告应用程序,需要从第三方服务器获取用户数据,该服务器允许每秒1个请求。

    我们需要去接 10万 10万 基于用户的行数,每个请求最多可以获取250行。

    因此,限制是:

    1.我们可以每秒发送1个请求

    2.250行/请求

    因此,获取一个用户数据需要400-4000个请求/作业,因此,为多个用户加载数据非常耗时,而且服务器速度很慢。

    因此,现在,我们计划使用多个服务器加载数据,例如4-10个服务器来获取用户数据,因此我们可以每秒从10个服务器发送10个请求。

    我们如何设计系统并处理来自多个服务器的作业?

    是否可以使用专用服务器托管Redis,并从多个服务器连接到该Redis服务器并执行作业?是否会发生任何冲突/种族状况?

    任何与此相关的提示或之前的经验都会非常有用。

    1 回复  |  直到 4 年前
        1
  •  2
  •   Adam Marshall    7 年前

    简而言之,是的,这是绝对可能的,我以前在生产应用程序中多次实现过这一点。

    Redis和任何其他服务一样,可以在任何地方运行,任何地方的客户端都可以连接到它。这完全取决于您对服务器的配置,以决定如何准确地进行操作(以及添加密码、配置SPIED、限制通过防火墙的访问等)。我建议大家阅读一下他们在管理部分的文档: https://redis.io/documentation

    此外,当您迁移到一个专用的Redis主机,并且有多个客户端访问该主机时,您可能需要考虑让不止一个Redis服务器运行,以实现可靠性、高可用性等。Redis通过几个简单的配置命令提供了高效易用的复制,您可以在此处阅读更多信息: https://redis.io/topics/replication

    在Redis上的最后一件事是,如果您最终实现了主从设置,那么如果您的主实例发生故障,您可能需要研究高可用性和自动故障切换。Redis在应用程序中内置了一个非常强大的实用程序,可以监视主服务器和从服务器,检测主服务器何时关闭,并自动重新配置服务器,将其中一个从服务器升级到新的主服务器。该实用程序称为Redis Sentinel,您可以在此处阅读: https://redis.io/topics/sentinel

    对于您关于竞争条件的问题,这取决于您如何准确地编写推送到队列中的作业。不过,对于您的用例来说,这听起来并不是一个太大的问题,但它实际上取决于第三方系统的约束。无论哪种方式,如果您受制于竞争条件,您仍然可以为其实现解决方案,但可能需要使用Redis锁之类的东西( https://redis.io/topics/distlock ). Taylor最近在即将发布的Laravel 5.6版本中添加了一个新功能,我认为它在调度程序中实现了Redis锁的一个版本( https://medium.com/@taylorotwell/laravel-5-6-preview-single-server-scheduling-54df8e0e139b ). 您可以研究它是如何实现的,如果您最终需要它,可以根据您的用例进行调整。