2016-11-02 20 views
1

我试图巩固我对blocking对Web服务器的请求意味着什么的理解,以及何时将请求交给单独的工作人员(即sidekiq)是明智的。何时将工作从Web服务器切换到工作人员

请看下面的例子:

  1. 登录与Facebook

    def sign_in 
        response = Faraday.get("https://graph.facebook.com/me?fields=id,email&access_token=#{some_token}") 
        user_info = JSON.parse(response.body) 
        @user = User.find_by(uid: user_info["id"]) 
        ... 
    end 
    
  2. 发送推送通知通过谷歌火力地堡

    def send_push_notification 
        ... 
        fcm = FCM.new(FCM_KEY) 
        registration_ids = [recipient_token] 
        resp = fcm.send(registration_ids, data: {body: notification_params[:body]}) 
        ... 
    end 
    

在这两个例子中,网络REQ对于第三方服务的使用是同步的并且可能是昂贵的。直觉上,我会尝试处理这些情况与单独的工作人员,因为他们的主要应用程序。但是,我不是100%肯定什么阻止的意思。这是否意味着当有100个用户试图拨打sign_in和每个Faraday.get通话需要1秒时,所有用户都需要100秒才能登录?

+0

要通过FCM发送通知,您可以使用后台进程。像sidekiq,delayed_job等。这是在应用程序内部集成通知模块的正确方法。 –

+0

@DarpanChhatravala是啊!我很想听听这个问题的后半部分,它提出了“......我不能100%确定阻塞是什么意思,这是否意味着当有100个用户试图登录并且每个Faraday.get调用需要1其次,所有用户都需要100秒才能登录?“ –

+0

我没有与我实现exp我一次读过这个博客,你可以尝试执行gem'faraday-request-timer'。从这你会得到总的请求时间。希望这将有助于完整:) –

回答

1

这是否意味着,当有100个用户试图sign_in每个 Faraday.get呼叫需要1秒,这将需要100秒,所有 用户登录?

单纯的回答:是的。

在一个非常简单的情况下,第一个用户将等待1秒,第二个用户将等待2秒等等。

如果您的应用程序/ Web服务器不中止用户请求,第100个用户将等待100秒。

更详细一些:取决于。

今天,现代Web应用程序(如Puma)在您的计算机上运行有超过1个进程工作者。这意味着您的应用程序能够同时处理多个请求。

例如:如果您将Puma配置为使用2名工人,则您的应用程序将同时处理2个用户的请求。

因此,第1和第2用户将等待1秒,第3和第4用户将等待2秒,第99和第100个用户将等待50秒。

由于每个美洲狮进程消耗大量的CPU和内存,你不能有无限的工人。这就是为什么非常有趣的有一个后台进程发送这些推送通知。

在Sidekiq(例如)将工作委托给工作人员的成本非常低,因此您的网站用户不会受到处罚。