何时将工作从 Web 服务器移交给工作人员
When to hand off work from web server to worker
我正在努力巩固我对 blocking
对网络服务器请求的含义以及何时将请求移交给单独的工作人员(即 sidekiq)是明智的理解。
考虑以下示例:
使用 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
通过 Google Firebase 发送推送通知
def send_push_notification
...
fcm = FCM.new(FCM_KEY)
registration_ids = [recipient_token]
resp = fcm.send(registration_ids, data: {body: notification_params[:body]})
...
end
在这两个示例中,对第 3 方服务的 Web 请求是同步的并且可能成本很高。直觉上,我会尝试用一个单独的 worker 来处理这些情况,因为它们 阻塞 主应用程序。但是,我不是 100% 确定 blocking 是什么意思。这是否意味着当有 100 个用户尝试 sign_in
并且每个 Faraday.get
调用需要 1 秒时,所有用户都需要 100 秒才能登录?
Does it mean that when there are 100 users trying to sign_in and each
Faraday.get call takes 1 second, it will take 100 seconds for all the
users to sign in?
简单回答:是。
在一个非常简单的场景中,第一个用户将等待 1 秒,第二个用户将等待 2 秒,依此类推。
如果您的 application/web 服务器没有中止用户请求,第 100 个用户将等待 100 秒。
更详细一点:看情况。
如今,现代 Web 应用程序(如 Puma)在您的机器中有超过 1 个进程工作线程 运行。这意味着您的应用程序能够同时处理 1 个以上的请求。
例如:如果您将 Puma 配置为使用 2 个 worker,您的应用程序将同时处理 2 个用户的请求。
因此,第 1 和第 2 个用户将等待 1 秒,第 3 和第 4 个用户将等待 2 秒,第 99 和第 100 个用户将等待 50 秒。
由于每个 Puma 进程都会消耗大量 CPU 和内存,因此您不能拥有无限的工作人员。这就是为什么有一个后台进程来发送这些推送通知非常有趣。
在 Sidekiq(例如)中,将工作委托给工人的成本非常低,因此您网站的用户不会受到惩罚。
我正在努力巩固我对 blocking
对网络服务器请求的含义以及何时将请求移交给单独的工作人员(即 sidekiq)是明智的理解。
考虑以下示例:
使用 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
通过 Google Firebase 发送推送通知
def send_push_notification ... fcm = FCM.new(FCM_KEY) registration_ids = [recipient_token] resp = fcm.send(registration_ids, data: {body: notification_params[:body]}) ... end
在这两个示例中,对第 3 方服务的 Web 请求是同步的并且可能成本很高。直觉上,我会尝试用一个单独的 worker 来处理这些情况,因为它们 阻塞 主应用程序。但是,我不是 100% 确定 blocking 是什么意思。这是否意味着当有 100 个用户尝试 sign_in
并且每个 Faraday.get
调用需要 1 秒时,所有用户都需要 100 秒才能登录?
Does it mean that when there are 100 users trying to sign_in and each Faraday.get call takes 1 second, it will take 100 seconds for all the users to sign in?
简单回答:是。
在一个非常简单的场景中,第一个用户将等待 1 秒,第二个用户将等待 2 秒,依此类推。
如果您的 application/web 服务器没有中止用户请求,第 100 个用户将等待 100 秒。
更详细一点:看情况。
如今,现代 Web 应用程序(如 Puma)在您的机器中有超过 1 个进程工作线程 运行。这意味着您的应用程序能够同时处理 1 个以上的请求。
例如:如果您将 Puma 配置为使用 2 个 worker,您的应用程序将同时处理 2 个用户的请求。
因此,第 1 和第 2 个用户将等待 1 秒,第 3 和第 4 个用户将等待 2 秒,第 99 和第 100 个用户将等待 50 秒。
由于每个 Puma 进程都会消耗大量 CPU 和内存,因此您不能拥有无限的工作人员。这就是为什么有一个后台进程来发送这些推送通知非常有趣。
在 Sidekiq(例如)中,将工作委托给工人的成本非常低,因此您网站的用户不会受到惩罚。