shared_broker 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +102 -0
- data/Rakefile +12 -0
- data/lib/shared_broker/version.rb +5 -0
- data/lib/shared_broker.rb +27 -0
- data/sig/shared_broker.rbs +4 -0
- metadata +149 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 113868a35ebcb87b89d4ce8b0ba3079276ffdb8a07a519ec5ee5cbb28d605f24
|
|
4
|
+
data.tar.gz: 5d7cbddbf655269f55bc9b752172de08d52bbcf8d3864ef1164c9458731ae66b
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: dd263b0bf50aec4e4ac83e85de4c8fadf8a59bc8ddbcdc4195862bc791aeb2770c866f15cfecec5633313b457897923cc56c2ab990299f95f1fbff03465b9022
|
|
7
|
+
data.tar.gz: 7693f227da2d82c5389074f4e8375ed011ffe2cd77c7e4517480ec38308500c15ccab679a2a326af31ac3ca08f77cc084b7031ebb3d0e291e18745c9335e97ab
|
data/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# SharedBroker
|
|
2
|
+
|
|
3
|
+
`SharedBroker` is a high-performance Ruby library designed to simplify event-based communication (asynchronous messaging) and telemetry (observability) in Rails microservice architectures.
|
|
4
|
+
|
|
5
|
+
The library implements the **Adapter Pattern** to decouple your application from physical queue providers (like RabbitMQ), allowing easy broker swapping and clean synchronous testing with an in-memory adapter.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Key Features
|
|
10
|
+
|
|
11
|
+
- **Pluggable Messaging**: Adapter pattern to decouple Rails from physical messaging queues.
|
|
12
|
+
- **RabbitMQ Adapter**: Robust, persistent connection wrapper using the `bunny` gem.
|
|
13
|
+
- **InMemory Adapter**: Synchronous local queue simulation for fast TDD testing (no inline external I/O stubs required).
|
|
14
|
+
- **Integrated OpenTelemetry**: Centralized SDK configuration with auto-instrumentation for all supported libraries (ActiveRecord, Bunny, Faraday, Rails, PG, etc.).
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
Add this line to your application's `Gemfile`:
|
|
21
|
+
|
|
22
|
+
```ruby
|
|
23
|
+
gem "shared_broker", path: "gems/shared_broker" # for local gem
|
|
24
|
+
# or when published:
|
|
25
|
+
# gem "shared_broker"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
And execute:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
bundle install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Configuration
|
|
37
|
+
|
|
38
|
+
Create an initializer in your Rails application (`config/initializers/shared_broker.rb`):
|
|
39
|
+
|
|
40
|
+
```ruby
|
|
41
|
+
require "shared_broker"
|
|
42
|
+
|
|
43
|
+
# 1. Configure the Adapter based on Environment
|
|
44
|
+
if Rails.env.test?
|
|
45
|
+
# In-memory adapter prevents external queue dependency during unit tests
|
|
46
|
+
BROKER_ADAPTER = SharedBroker::Adapters::InMemory.new
|
|
47
|
+
else
|
|
48
|
+
# Connects to real RabbitMQ broker
|
|
49
|
+
amqp_url = ENV.fetch("RABBITMQ_URL") { "amqp://guest:guest@localhost:5672" }
|
|
50
|
+
BROKER_ADAPTER = SharedBroker::Adapters::RabbitMQ.new(amqp_url: amqp_url)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# 2. Instantiate the Client by Injecting the Adapter
|
|
54
|
+
SPOT_BROKER = SharedBroker::Client.new(adapter: BROKER_ADAPTER)
|
|
55
|
+
|
|
56
|
+
# 3. Initialize Telemetry (OpenTelemetry)
|
|
57
|
+
SharedBroker::Telemetry.configure(service_name: "my_microservice")
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Usage
|
|
63
|
+
|
|
64
|
+
### Publishing Events
|
|
65
|
+
Send simple events by passing the topic name and a structured payload (must be a `Hash`):
|
|
66
|
+
|
|
67
|
+
```ruby
|
|
68
|
+
event_data = {
|
|
69
|
+
id: 1,
|
|
70
|
+
name: "Eiffel Tower",
|
|
71
|
+
latitude: 48.8584,
|
|
72
|
+
longitude: 2.2945
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
SPOT_BROKER.publish("spot.created", event_data)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Subscribing to Events (Consumer)
|
|
79
|
+
To start a persistent event subscriber daemon, register a queue associated with the topic:
|
|
80
|
+
|
|
81
|
+
```ruby
|
|
82
|
+
SPOT_BROKER.subscribe("spot.created", "my_consumption_queue") do |payload|
|
|
83
|
+
puts "Event successfully consumed! ID: #{payload[:id]}"
|
|
84
|
+
# execute your business logic here...
|
|
85
|
+
end
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Running Gem Tests
|
|
91
|
+
|
|
92
|
+
To run the unit test suite using **Minitest**:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
bundle exec rake test
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## License
|
|
101
|
+
|
|
102
|
+
This Gem is available under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "shared_broker/version"
|
|
4
|
+
require_relative "shared_broker/telemetry"
|
|
5
|
+
require_relative "shared_broker/adapters/base"
|
|
6
|
+
require_relative "shared_broker/adapters/in_memory"
|
|
7
|
+
require_relative "shared_broker/adapters/rabbit_mq"
|
|
8
|
+
|
|
9
|
+
module SharedBroker
|
|
10
|
+
class Client
|
|
11
|
+
def initialize(adapter:)
|
|
12
|
+
unless adapter.respond_to?(:publish) && adapter.respond_to?(:subscribe)
|
|
13
|
+
raise ArgumentError, "Expected adapter to respond to :publish and :subscribe, got #{adapter.class} with value #{adapter.inspect}"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
@adapter = adapter
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def publish(topic, message)
|
|
20
|
+
@adapter.publish(topic, message)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def subscribe(topic, queue_name, &block)
|
|
24
|
+
@adapter.subscribe(topic, queue_name, &block)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: shared_broker
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Gemini Antigravity
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-06-06 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bunny
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.22'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.22'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: opentelemetry-api
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.2'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.2'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: opentelemetry-sdk
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '1.2'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '1.2'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: opentelemetry-exporter-otlp
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0.25'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.25'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: opentelemetry-instrumentation-all
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0.25'
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0.25'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: minitest
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '5.20'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '5.20'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: rake
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '13.0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '13.0'
|
|
111
|
+
description: Shared library for asynchronous messaging, distributed tracing, and customizable
|
|
112
|
+
adapters.
|
|
113
|
+
email:
|
|
114
|
+
- antigravity@google.com
|
|
115
|
+
executables: []
|
|
116
|
+
extensions: []
|
|
117
|
+
extra_rdoc_files: []
|
|
118
|
+
files:
|
|
119
|
+
- README.md
|
|
120
|
+
- Rakefile
|
|
121
|
+
- lib/shared_broker.rb
|
|
122
|
+
- lib/shared_broker/version.rb
|
|
123
|
+
- sig/shared_broker.rbs
|
|
124
|
+
homepage: https://github.com/onkai/shared_broker
|
|
125
|
+
licenses:
|
|
126
|
+
- MIT
|
|
127
|
+
metadata:
|
|
128
|
+
source_code_uri: https://github.com/onkai/shared_broker
|
|
129
|
+
changelog_uri: https://github.com/onkai/shared_broker/blob/main/CHANGELOG.md
|
|
130
|
+
post_install_message:
|
|
131
|
+
rdoc_options: []
|
|
132
|
+
require_paths:
|
|
133
|
+
- lib
|
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - ">="
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: 3.0.0
|
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
|
+
requirements:
|
|
141
|
+
- - ">="
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: '0'
|
|
144
|
+
requirements: []
|
|
145
|
+
rubygems_version: 3.5.22
|
|
146
|
+
signing_key:
|
|
147
|
+
specification_version: 4
|
|
148
|
+
summary: Pluggable message broker abstraction with RabbitMQ and OpenTelemetry support.
|
|
149
|
+
test_files: []
|