【问题标题】:AWS/EBS Background Jobs in RailsRails 中的 AWS/EBS 后台作业
【发布时间】:2016-12-04 04:16:06
【问题描述】:

我在 AWS 上有一个使用 Rails 编写的 Elastic Beanstalk/RDS/EC2/etc 的应用程序。

该应用有一些数据库条目需要在一定时间后删除,并且正在考虑使用 gem 创建一个后台任务。

但是,我看到的所有 gem 都只是以编程方式创建 cron 任务的方法。使用 Elastic Beanstalk,正在使用的服务器实例将扩展/更改,因此 cron 任务将丢失。还有其他方法可以在 Rails 中设置后台作业吗?

【问题讨论】:

  • 对 Rails 不太熟悉,但看看这个可能会有所帮助github.com/collectiveidea/delayed_job
  • 这让我很接近,但我需要将我的任务设置为以特定间隔运行(每分钟、每天晚上 11 点等)
  • 你没有提到 RDS 的版本,但如果是 MySQL 或 MariaDB,有内置的event scheduler...
  • 哎呀,对不起!我正在使用 PostgreSQL。
  • 我使用 Rufus Scheduler 解决了这个问题:github.com/jmettraux/rufus-scheduler 谢谢大家!

标签: ruby-on-rails amazon-web-services amazon-rds amazon-ebs


【解决方案1】:

我通常通过使用container_commands 来解决此问题,您可以在应用程序中.ebextensions 文件夹内的.config 文件中进行配置。 <s>The idea is that the code is executed on so-called 'leader' instance in your webservers pool. It is not considered as a bulletproof solution but does the job and mostly works (it will fail when autoscaling comes into play though).</s> 使用分布式互斥锁(redis-mutex 或数据库支持)来阻塞除获得锁的进程之外的所有进程。

#create config file, use numbers/names that suit your needs:
#.ebextensions/02_container_commands.config 
container_commands:
  01_cron_tasks:
    command: "cat .ebextensions/cron_tasks.txt > /etc/cron.d/yourapp && chmod 644 /etc/cron.d/yourapp"
    leader_only: true

cron 会选择这个,只需将 crontab 定义放在 .ebextensions/cron_tasks.txt 文件中,并将这个也添加到您的 Git 存储库中。

0 5 * * * root bash -l -c "su -m webapp; cd /var/app/current && rake your_rake_task"

很遗憾,但亚马逊 AWS 团队似乎仍然没有想出一个合适、方便的解决方案来在 Elastic Beanstalk 环境中使用 Rails 调度后台作业。他们的 Worker Tier 要求您在应用程序中添加一个专用端点,以侦听来自他们自己的 cron 实现的消息。这很糟糕,因为它迫使您将特定于托管的代码添加到核心应用程序逻辑(路由、控制器)中,并且需要运行更多服务器。

与 Heroku 等平台相比,AWS 的另一个缺点是缺乏对 Redis 支持的队列系统(如 Sidekiq)和可以通过类似 cron 的调度程序产生的按需工作人员的一键式支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多