1

我想构建一个在 url 返回时通知我的服务status 200。我目前正在使用一个sidekiq工人,如果是status == 200,它会更新我的数据库(row.available = true),如果不是,它会引发一个异常并在n seconds, n amount of times.

虽然这可行,但感觉并不高效或可扩展(1000 次检查会导致 1000 次异常,在某些平台上这是个坏消息——JRuby),我确信有一种方法可以构建内部服务管理这个不依赖 sidekiq 的 url 监控(可能在 Go 或其他更适合的 Ruby gem 中)。但是,我不知道从哪里开始,所以我很感激一些大方向。

4

1 回答 1

2

编写和运行一个简单的链接检查器很容易。在没有冗余的情况下快速处理 1000 条链接,并且在不让整个系统陷入瘫痪的情况下处理死链接和响应缓慢的链接变得更加困难。

我会使用三个线程,加上两个队列:

  1. 仅从数据库读取的调度程序线程。它负责查找和排队要检入“待检”队列的 URL。
  2. 从第一个队列消费并将结果推送到“更新的 URL 结果”队列的工作线程。
  3. 一个更新者/消费者线程,它获取 #2 中线程的结果并更新数据库。

Ruby 有一些内置类可以提供帮助:

我强烈推荐Typhoeus 和 Hydra用于中线。这两个类的文档涵盖了您在处理并行运行的多个线程方面需要做的很多事情。

不会将此代码编写为 Rails 应用程序的一部分。Rails 没有为此增加任何价值,也没有必要。我要么需要 Active Record 并搭载现有的 database.yaml 设置和模型,要么使用Rails 的“运行器”将代码作为 Rails 代码的附件运行。

或者,我会编写一小段特定于应用程序的代码以在不同的服务器上运行,以避免使 Rails 服务器陷入瘫痪。使用 MySQL 或 PostgreSQL 之类的驱动程序可以让您与 Rails 使用的同一数据库通信。在这种情况下,我会使用Sequel gem 作为 ORM,但那是因为我更喜欢它而不是 Active Record。

在编写此代码时需要考虑很多事情,包括重试失败的 URL、感知重定向和更新源 URL 以反映它们以避免浪费时间,以及不殴打导致您被禁止的托管服务器。

多年来,我为此目的编写了几个应用程序,正确地做这件事需要大量的深谋远虑,所以请预先考虑好你的设计,否则你可能会在以后进行一些重大的重写。

于 2013-09-01T20:52:16.323 回答