mirror of
https://github.com/ditkrg/rabbit_carrots.git
synced 2026-01-26 07:32:56 +00:00
Compare commits
4 Commits
rewrite
...
broosk1993
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2dd059194 | ||
|
59ad012e04
|
|||
|
3950ff5047
|
|||
|
|
edb1fffad1 |
@@ -1,7 +1,7 @@
|
|||||||
PATH
|
PATH
|
||||||
remote: .
|
remote: .
|
||||||
specs:
|
specs:
|
||||||
rabbit_carrots (0.1.20)
|
rabbit_carrots (1.0.2)
|
||||||
bunny (>= 2.22)
|
bunny (>= 2.22)
|
||||||
connection_pool (~> 2.4)
|
connection_pool (~> 2.4)
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ GEM
|
|||||||
rubocop-ast (>= 1.30.0, < 2.0)
|
rubocop-ast (>= 1.30.0, < 2.0)
|
||||||
ruby-progressbar (1.13.0)
|
ruby-progressbar (1.13.0)
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
set (1.0.3)
|
set (1.1.0)
|
||||||
sorted_set (1.0.3)
|
sorted_set (1.0.3)
|
||||||
rbtree
|
rbtree
|
||||||
set (~> 1.0)
|
set (~> 1.0)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# RabbitCarrots
|
# RabbitCarrots
|
||||||
|
|
||||||
RabbitCarrots is a simple background task based on rake to handle the consumption of RabbitMQ message in Rails applications. It is an opinionated library that solves the consumption of messages among microservices, given the following conditions:
|
RabbitCarrots is a simple background worker to handle the consumption of RabbitMQ message in Rails applications. It is an opinionated library that solves the consumption of messages among microservices, given the following conditions:
|
||||||
|
|
||||||
1. RabbitMQ is used as an event bus for communication.
|
1. RabbitMQ is used as an event bus for communication.
|
||||||
2. Messages are routed using a single exchange, multiple routing keys.
|
2. Messages are routed using a single exchange, multiple routing keys.
|
||||||
@@ -36,6 +36,7 @@ RabbitCarrots.configure do |c|
|
|||||||
c.automatically_recover = true
|
c.automatically_recover = true
|
||||||
c.network_recovery_interval = 5
|
c.network_recovery_interval = 5
|
||||||
c.recovery_attempts = 5
|
c.recovery_attempts = 5
|
||||||
|
c.orm = :activerecord || :mongoid
|
||||||
c.routing_key_mappings = [
|
c.routing_key_mappings = [
|
||||||
{ routing_keys: ['RK1', 'RK2'], queue: 'QUEUE_NAME', handler: 'CLASS HANDLER IN STRING' },
|
{ routing_keys: ['RK1', 'RK2'], queue: 'QUEUE_NAME', handler: 'CLASS HANDLER IN STRING' },
|
||||||
{ routing_keys: ['RK1', 'RK2'], queue: 'QUEUE_NAME', handler: 'CLASS HANDLER IN STRING' }
|
{ routing_keys: ['RK1', 'RK2'], queue: 'QUEUE_NAME', handler: 'CLASS HANDLER IN STRING' }
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# rabbit_carrots.rb
|
# rabbit_carrots.rb
|
||||||
|
|
||||||
require 'puma/plugin'
|
require 'puma/plugin'
|
||||||
|
require 'rabbit_carrots'
|
||||||
|
|
||||||
Puma::Plugin.create do
|
Puma::Plugin.create do
|
||||||
attr_reader :puma_pid, :rabbit_carrots_pid, :log_writer, :core_service
|
attr_reader :puma_pid, :rabbit_carrots_pid, :log_writer, :core_service
|
||||||
|
|||||||
@@ -1,26 +1,11 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative 'rabbit_carrots/version'
|
require_relative 'rabbit_carrots/version'
|
||||||
|
require 'rabbit_carrots/errors'
|
||||||
require 'rabbit_carrots/connection'
|
require 'rabbit_carrots/connection'
|
||||||
require 'rabbit_carrots/core'
|
|
||||||
require 'rabbit_carrots/configuration'
|
require 'rabbit_carrots/configuration'
|
||||||
require 'rabbit_carrots/railtie' if defined?(Rails)
|
require 'rabbit_carrots/railtie' if defined?(Rails)
|
||||||
|
require 'rabbit_carrots/core'
|
||||||
|
|
||||||
module RabbitCarrots
|
module RabbitCarrots
|
||||||
class Error < StandardError; end
|
|
||||||
|
|
||||||
module EventHandlers
|
|
||||||
module Errors
|
|
||||||
class IrrelevantMessage < StandardError
|
|
||||||
end
|
|
||||||
|
|
||||||
class NackMessage < StandardError
|
|
||||||
end
|
|
||||||
|
|
||||||
class NackAndRequeueMessage < StandardError
|
|
||||||
end
|
|
||||||
|
|
||||||
class PlaceholderError < Error; end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ module RabbitCarrots
|
|||||||
:rabbitmq_exchange_name,
|
:rabbitmq_exchange_name,
|
||||||
:automatically_recover,
|
:automatically_recover,
|
||||||
:network_recovery_interval,
|
:network_recovery_interval,
|
||||||
:recovery_attempts
|
:recovery_attempts,
|
||||||
|
:orm
|
||||||
|
def orm
|
||||||
|
@orm ||= :activerecord
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,9 +2,13 @@ module RabbitCarrots
|
|||||||
class Core
|
class Core
|
||||||
attr_reader :logger
|
attr_reader :logger
|
||||||
|
|
||||||
DatabaseAgonsticNotNullViolation = defined?(ActiveRecord) ? ActiveRecord::NotNullViolation : RabbitCarrots::EventHandlers::Errors::PlaceholderError
|
@database_agnostic_not_null_violation = nil
|
||||||
DatabaseAgonsticConnectionNotEstablished = defined?(ActiveRecord) ? ActiveRecord::ConnectionNotEstablished : Mongo::Error::SocketError
|
@database_agnostic_connection_not_established = nil
|
||||||
DatabaseAgnosticRecordInvalid = defined?(ActiveRecord) ? ActiveRecord::RecordInvalid : Mongoid::Errors::Validations
|
@database_agnostic_record_invalid = nil
|
||||||
|
|
||||||
|
class << self
|
||||||
|
attr_accessor :database_agnostic_not_null_violation, :database_agnostic_connection_not_established, :database_agnostic_record_invalid
|
||||||
|
end
|
||||||
|
|
||||||
def initialize(logger: nil)
|
def initialize(logger: nil)
|
||||||
@logger = logger || Logger.new(Rails.env.production? ? '/proc/self/fd/1' : $stdout)
|
@logger = logger || Logger.new(Rails.env.production? ? '/proc/self/fd/1' : $stdout)
|
||||||
@@ -14,6 +18,10 @@ module RabbitCarrots
|
|||||||
end
|
end
|
||||||
|
|
||||||
def start(kill_to_restart_on_standard_error: false)
|
def start(kill_to_restart_on_standard_error: false)
|
||||||
|
self.class.database_agnostic_not_null_violation = RabbitCarrots.configuration.orm == :activerecord ? ActiveRecord::NotNullViolation : RabbitCarrots::EventHandlers::Errors::PlaceholderError
|
||||||
|
self.class.database_agnostic_connection_not_established = RabbitCarrots.configuration.orm == :activerecord ? ActiveRecord::ConnectionNotEstablished : ::Mongo::Error::SocketError
|
||||||
|
self.class.database_agnostic_record_invalid = RabbitCarrots.configuration.orm == :activerecord ? ActiveRecord::RecordInvalid : ::Mongoid::Errors::Validations
|
||||||
|
|
||||||
channels = RabbitCarrots.configuration.routing_key_mappings.map do |mapping|
|
channels = RabbitCarrots.configuration.routing_key_mappings.map do |mapping|
|
||||||
{ **mapping, handler: mapping[:handler].constantize }
|
{ **mapping, handler: mapping[:handler].constantize }
|
||||||
end
|
end
|
||||||
@@ -89,10 +97,10 @@ module RabbitCarrots
|
|||||||
rescue RabbitCarrots::EventHandlers::Errors::NackAndRequeueMessage => _e
|
rescue RabbitCarrots::EventHandlers::Errors::NackAndRequeueMessage => _e
|
||||||
logger.log "Nacked and Requeued message: #{payload}"
|
logger.log "Nacked and Requeued message: #{payload}"
|
||||||
channel.nack(delivery_info.delivery_tag, false, true)
|
channel.nack(delivery_info.delivery_tag, false, true)
|
||||||
rescue DatabaseAgonsticNotNullViolation, DatabaseAgnosticRecordInvalid => e
|
rescue self.class.database_agnostic_not_null_violation, self.class.database_agnostic_record_invalid => e
|
||||||
logger.log "Null constraint or Invalid violation: #{payload}. Error: #{e.message}"
|
logger.log "Null constraint or Invalid violation: #{payload}. Error: #{e.message}"
|
||||||
channel.ack(delivery_info.delivery_tag, false)
|
channel.ack(delivery_info.delivery_tag, false)
|
||||||
rescue DatabaseAgonsticConnectionNotEstablished => e
|
rescue self.class.database_agnostic_connection_not_established => e
|
||||||
logger.log "Error connection not established to the database: #{payload}. Error: #{e.message}"
|
logger.log "Error connection not established to the database: #{payload}. Error: #{e.message}"
|
||||||
sleep 3
|
sleep 3
|
||||||
channel.nack(delivery_info.delivery_tag, false, true)
|
channel.nack(delivery_info.delivery_tag, false, true)
|
||||||
@@ -102,8 +110,6 @@ module RabbitCarrots
|
|||||||
channel.nack(delivery_info.delivery_tag, false, true)
|
channel.nack(delivery_info.delivery_tag, false, true)
|
||||||
Process.kill('SIGTERM', Process.pid) if kill_to_restart_on_standard_error
|
Process.kill('SIGTERM', Process.pid) if kill_to_restart_on_standard_error
|
||||||
end
|
end
|
||||||
|
|
||||||
logger.log "Ending task for queue: #{queue_name}"
|
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
logger.error "Bunny session error: #{e.message}"
|
logger.error "Bunny session error: #{e.message}"
|
||||||
|
|||||||
18
lib/rabbit_carrots/errors.rb
Normal file
18
lib/rabbit_carrots/errors.rb
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
module RabbitCarrots
|
||||||
|
class Error < StandardError; end
|
||||||
|
|
||||||
|
module EventHandlers
|
||||||
|
module Errors
|
||||||
|
class IrrelevantMessage < StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class NackMessage < StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class NackAndRequeueMessage < StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class PlaceholderError < Error; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module RabbitCarrots
|
module RabbitCarrots
|
||||||
VERSION = '0.1.20'
|
VERSION = '1.0.2'
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user