首页 > 解决方案 > Action Mailer 和 Sidekiq,电子邮件卡在队列中

问题描述

我正在尝试使用 docker 和 sidekiq 设置我的 rails 应用程序,以便发送电子邮件。这是我的设置:

码头工人-compose.yml

version: '3'
services:
  db:
    image: postgres
    env_file: .env
    volumes:
      - ./tmp/db:/var/lib/postgresql/data

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails server puma -b 'ssl://0.0.0.0:3000?key=server.key&cert=server.crt'"
    env_file: .env
    volumes:
      - '.:/project'
    ports:
      - "3000:3000"
    links:
      - elasticsearch
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
      - REDIS_URL_SIDEKIQ=redis://redis:6379/1
    depends_on:
      - db
      - redis

    elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    ports:
      - "9200:9200"
    environment:
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "http.host=0.0.0.0"
      - "transport.host=127.0.0.1"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 1g
    cap_add:
      - IPC_LOCK
    volumes:
      - /usr/share/elasticsearch/data

  redis:
    image: 'redis:6.2.0-alpine'
    command: redis-server
    ports:
      - '6379:6379'
    volumes:
      - 'redis:/data'

  sidekiq:
    depends_on:
      - 'db'
      - 'redis'
    build: .
    command: bundle exec sidekiq -e development -q mailers -q default
    volumes:
      - '.:/project'
    environment:
      - REDIS_URL_SIDEKIQ=redis://redis:6379/12

volumes:
  redis:
  postgres:

Dockerfile

FROM ruby:2.7.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install
COPY . /myapp

Sidekq.yml

:concurrency: 1
:queues:
  - mailers

应用程序.rb

config.active_job.queue_adapter = :sidekiq

config.action_mailer.deliver_later_queue_name = 'mailers'

Sidekiq.configure_server { |c| c.redis = { url: ENV['REDIS_URL'] } }

正如您从下面的屏幕截图中看到的那样,sidekiq 和其他一切都运行良好。

在此处输入图像描述

我还使用 devise 和 devise-async gems 来注册用户并使用 sidekiq 发送异步电子邮件:

gem 'devise'
gem "devise-async"

设计异步.rb

Devise::Async.setup do |config|
  config.enabled = true
end

但问题是,当我通过设计过程注册用户时,确认电子邮件永远不会发送。它似乎被困在排队中:

在此处输入图像描述

关于如何发送卡在队列中的电子邮件的任何想法?

标签: ruby-on-railsdockerdevisesidekiq

解决方案


推荐阅读