2015-05-14 9 views
17

Ich bin mit Rails 4.2 auf Heroku (Zeder), Rubin 2.1.6Wie kann ich ActiveJob dazu bringen, Jobs in Sidekiq auf Heroku in die Warteschlange einzureihen, wenn es von der App (nicht von der Konsole aus) aufgerufen wird?

Ich habe Sidekiq lokal auf Redis mit Foreman läuft, und in meiner app nenne ich wie diese neuen ActiveJob deliver_later Methoden Rails, innen application_helper.rb:

assigning_user = User.find(object.created_by) 
completing_user = User.find(object.completed_by) 
if NotificationMailer.assigned_user_completed_todo(object, completing_user, assigning_user).deliver_later 
    nn.email_status = "sent" 
end 

Lokal, das funktioniert wie beabsichtigt. Mails werden in der 'mailers'-Warteschlange angezeigt und dann mit sendgrid verarbeitet und zugestellt.

Auf heroku run rails console Ich kann es manuell auslösen, und es funktioniert gut:

Loading production environment (Rails 4.2.1) 
irb(main):001:0> a = Account.first 
Account Load (1.5ms) SELECT "accounts".* FROM "accounts" ORDER BY  "accounts"."id" ASC LIMIT 1 
=> #<Account id: 1, name: "The Prestons", stripe_customer_id: nil, active_until: "2015-06-27 14:50:43", plan: nil, created_at: "2015-04-27 14:50:43", updated_at: "2015-04-27 14:50:43"> 
irb(main):002:0> NotificationMailer.new_account_created(a).deliver_later 
Enqueued ActionMailer::DeliveryJob (Job ID: 7c0ddf9c-6892-4aa9-823e-9954b2a4e642) to Sidekiq(mailers) with arguments: "NotificationMailer", "new_account_created", "deliver_now", gid://raisin/Account/1 
=> #<ActionMailer::DeliveryJob:0x007f4d9ed9da58 @arguments=["NotificationMailer", "new_account_created", "deliver_now", #<Account id: 1, name: "The Prestons", stripe_customer_id: nil, active_until: "2015-06-27 14:50:43", plan: nil, created_at: "2015-04-27 14:50:43", updated_at: "2015-04-27 14:50:43">], @job_id="7c0ddf9c-6892-4aa9-823e-9954b2a4e642", @queue_name="mailers"> 

aber wenn ich einfach komplette Aktionen in meiner app, so wie ich als Benutzer würde, nichts jemals in die Warteschlange geliefert ... Ich habe keine Ideen mehr. Ich führe einen Arbeitsprozess. Ich bin mit dem Redis Cloud-Server verbunden. Ich kann das sidekiq Web Dashboard sehen.

Was stelle ich nicht ein? Gerne andere Logs/Infos zu liefern, aber nicht sicher, was noch zu bieten ist.

Meine Konsole meldet einfach die Aktion:

2015-05-14T09:14:37.674095+00:00 heroku[router]: at=info method=POST path="/accounts/1/projects/15/lists/33/items/112" host=www.myapp.com request_id=516db810-8a2c-4fd0-af89-29a59783b0a8 fwd="76.104.193.78" dyno=web.1 connect=1ms service=111ms status=200 bytes=2039 
+2

Beginnen Sie Sidekiq mit '-q-Mailern'? –

+0

Ja - vergessen, das zu erwähnen. IN meinem procfile: 'Arbeiter: Bündel exec sidekiq -q Standard-q mailers' –

Antwort

62

Peinlich, es stellt sich heraus, alles richtig funktioniert, und die Aktion, die ich E-Mail-Zustellung über den Code zu testen tat würde nie eine E-Mail, da die gesendeten Benutzer, den ich es getestet habe, hat E-Mail-Benachrichtigungen in Einstellungen deaktiviert.

Seufz.

Aber für die Nachwelt und für diejenigen, die versuchen, Sidekiq mit Rails 4.2 und Redis Cloud auf Heroku zu arbeiten, sind hier einige Fallstricke: Der Teil, der mir die meiste Zeit nahm, um herauszufinden, war, dass Wenn Sie sidekiq finden, um Ihren Redis-Server zu finden, müssen Sie die ENV-Variable IN HEROKU setzen (nicht in Ihrem Code). Also, an der Konsole, zuerst hinzufügen, z. rediscloud:

heroku addons:create rediscloud

Und dann müssen Sie die URL als Umgebungsvariable hinzuzufügen:

heroku config:set REDIS_PROVIDER=REDISCLOUD_URL

Die sidekiq Dokumentation ist super hilfreich. Ich benutzte brew install redis, um lokal zu installieren, dann redis-server, um den Server lokal in einem Terminalfenster auszuführen. Hinzugefügt gem 'sidekiq' zu der gemfile und alles hat super in der Entwicklung gearbeitet.

Wenn Sie die Routen as shown here hinzufügen, können Sie die Warteschlange in Ihrem Webbrowser überwachen.

Schließlich, vergessen Sie nicht, dass Sie einen Arbeiter in Ihrem Procfile hinzufügen und bis zu einem Arbeiter in Heroku mit heroku ps:scale worker=1 skalieren müssen - es wird nicht starten, nur weil es in Ihrem Procfile ist.

Auch: Wenn Sie sidekiq in Ihre Procfile stellen, vergewissern Sie sich, dass Sie sie anweisen, die Mailer-Warteschlange zu verarbeiten, z.:

worker: bundle exec sidekiq -q default -q mailers

+12

Eine wundervolle Zusammenfassung des Ermöglichens von Sidekiq in Heroku, danke für das große writup! –

+0

@jason ... und das vom Autor von sidekiq ... :) ja, gute Arbeit +1 –

+2

Great write-up! Das einzige, was ich vermisst habe (aber ich habe die Dokumentation nicht gut genug gelesen) ist, dass Sie tatsächlich einen Initialisierer für sidekiq hinzufügen müssen, in dem Sie die Anzahl der zu verwendenden Verbindungen definieren, wie https://gist.github.com/ vindia/7f356499e646898dbeab Ohne diesen Initialisierer blieben meine Jobs in der Warteschlange. – vindia