mimi-messaging 1.1.1 → 1.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4392d50097d139e224851c8d8609a7f3e092772
4
- data.tar.gz: 587ba9c7a31e84d732e377c02df969dcecd2a296
3
+ metadata.gz: 100b84c9fb56887c8eec1e80249ffbb67f064253
4
+ data.tar.gz: 57a5fa1bf3163053777ce68b0d2a6224bbc127ba
5
5
  SHA512:
6
- metadata.gz: c07418b84dc02e2e5d33cdf3c4b836b2aef84710ae6f53c539a99e918c3f5f488ee6efcd30e36b668dc81559808fed04baa9a6841cb5ebe8a5c9bc2d61c29c56
7
- data.tar.gz: 8c7a7441e4b5eed3b2013daf7450f52cf9127449257b692508d8d3f6c580d4a695aa1a360b2cb3faa737b6680e3d4ed3298f5ab76fcb4189c2dfc3d82ee967a8
6
+ metadata.gz: c85f6047982af4c061e422c7bbbb6713b3bf9039b14ac0eef18e9f745e97f3b27737eb90c513a301e056404a1d4f026fb8571076c95ccddbad8d3cf369264270
7
+ data.tar.gz: f372f54633f37e4ef98879c1c307cee0c3846d295213ee7a1b5ab68017e688957affcc61ef409cb41bb51817abb9fe665d8bb51ddf96de302dbb963e6a007887
data/README.md CHANGED
@@ -57,7 +57,7 @@ there are several available adapters:
57
57
  * [Kafka](https://github.com/kukushkin/mimi-messaging-kafka)
58
58
  * RabbitMQ (TBD)
59
59
  * NATS (TBD)
60
- * Amazon SQS/SNS
60
+ * [Amazon SQS/SNS](https://github.com/kukushkin/mimi-messaging-sqs_sns)
61
61
  * in-memory (single process)
62
62
 
63
63
  ## Designing apps
@@ -65,10 +65,11 @@ there are several available adapters:
65
65
 
66
66
  There are only two hard problems in distributed systems:
67
67
 
68
+ ```
68
69
  2. Exactly-once delivery
69
70
  1. Guaranteed order of messages
70
71
  2. Exactly-once delivery
71
-
72
+ ```
72
73
 
73
74
  ## License
74
75
 
@@ -14,14 +14,25 @@ module Mimi
14
14
  # Usage: [TBD]
15
15
  #
16
16
  module Messaging
17
- # Target validation pattern:
18
- # "[<name>.][...]<name>/<name>"
19
- # Where <name> consists of valid identifier characters: A-Za-z0-9_
17
+ # Request target validation pattern:
18
+ # "[<name>.][...]<name>/<identifier>"
19
+ # Where <name> consists of characters: A-Za-z0-9_-
20
+ # and <method_name> can be any of: A-Za-z0-9_
20
21
  #
21
22
  # Example:
22
23
  # "shop.orders/list"
23
24
  #
24
- TARGET_REGEX = %r{^((\w+)\.)*(\w+)\/(\w+)$}.freeze
25
+ REQUEST_TARGET_REGEX = %r{^([\w\-]+\.)*([\w\-]+)\/(\w+)$}.freeze
26
+
27
+ # Event target validation pattern:
28
+ # "[<name>.][...]<name>#<identifier>"
29
+ # Where <name> consists of characters: A-Za-z0-9_-
30
+ # and <method_name> can be any of: A-Za-z0-9_
31
+ #
32
+ # Example:
33
+ # "shop.orders#created"
34
+ #
35
+ EVENT_TARGET_REGEX = %r{^([\w\-]+\.)*([\w\-]+)\#(\w+)$}.freeze
25
36
 
26
37
  # By default Mimi::Messaging logs at given level
27
38
  DEFAULT_LOG_AT_LEVEL = :info
@@ -185,7 +196,7 @@ module Mimi
185
196
  # @return nil
186
197
  #
187
198
  def self.command(target, message = {}, opts = {})
188
- raise ArgumentError, "Invalid target argument" unless TARGET_REGEX.match(target)
199
+ raise ArgumentError, "Invalid target argument" unless REQUEST_TARGET_REGEX.match(target)
189
200
  raise ArgumentError, "Invalid message, Hash or Message is expected" unless message.is_a?(Hash)
190
201
  raise Error, "Failed to send command, adapter is not started" unless started?(:adapter)
191
202
 
@@ -206,7 +217,7 @@ module Mimi
206
217
  # @return [Hash]
207
218
  #
208
219
  def self.query(target, message = {}, opts = {})
209
- raise ArgumentError, "Invalid target argument" unless TARGET_REGEX.match(target)
220
+ raise ArgumentError, "Invalid target argument" unless REQUEST_TARGET_REGEX.match(target)
210
221
  raise ArgumentError, "Invalid message, Hash or Message is expected" unless message.is_a?(Hash)
211
222
  raise Error, "Failed to send query, adapter is not started" unless started?(:adapter)
212
223
 
@@ -215,12 +226,12 @@ module Mimi
215
226
 
216
227
  # Broadcasts the event with the given target
217
228
  #
218
- # @param target [String] "<topic>/<event_type>", e.g. "customers/created"
229
+ # @param target [String] "<topic>#<event_type>", e.g. "customers#created"
219
230
  # @param message [Hash,Mimi::Messaging::Message]
220
231
  # @param opts [Hash] additional options
221
232
  #
222
233
  def self.event(target, message = {}, opts = {})
223
- raise ArgumentError, "Invalid target argument" unless TARGET_REGEX.match(target)
234
+ raise ArgumentError, "Invalid target argument" unless EVENT_TARGET_REGEX.match(target)
224
235
  raise ArgumentError, "Invalid message, Hash or Message is expected" unless message.is_a?(Hash)
225
236
  raise Error, "Failed to broadcast event, adapter is not started" unless started?(:adapter)
226
237
 
@@ -339,7 +350,7 @@ module Mimi
339
350
  end
340
351
 
341
352
  message_processor_params = {
342
- type: :event,
353
+ type: :event_with_queue,
343
354
  topic_name: topic_name,
344
355
  queue_name: queue_name,
345
356
  processor: processor,
@@ -441,24 +452,27 @@ module Mimi
441
452
  end
442
453
  private_class_method :start_message_processor
443
454
 
444
- # Starts (registers) all message processors
455
+ # Starts all registered message processors at the adapter
445
456
  #
446
457
  def self.start_all_message_processors
447
458
  message_processors.each { |p| start_message_processor(p) }
448
459
  end
449
460
  private_class_method :start_all_message_processors
450
461
 
451
- # Stops (deregisters) all message processors
462
+ # Stops all registered message processors at the adapter
452
463
  #
453
464
  def self.stop_all_processors
454
465
  log "#{self} stopping all message processors"
455
466
  adapter.stop_all_processors
467
+ message_processors.each { |p| p[:started] = false }
456
468
  end
457
469
  private_class_method :stop_all_processors
458
470
 
459
- # Resets the internal state, private
471
+ # Deregisters all message processors
460
472
  #
461
- def self.reset
473
+ def self.unregister_all_processors
474
+ stop_all_processors
475
+ message_processors.replace([])
462
476
  end
463
477
  end # module Messaging
464
478
  end # module Mimi
@@ -88,7 +88,7 @@ module Mimi
88
88
 
89
89
  # Broadcasts the event with the given target
90
90
  #
91
- # @param target [String] "<topic>/<event_type>", e.g. "customers/created"
91
+ # @param target [String] "<topic>#<event_type>", e.g. "customers#created"
92
92
  # @param message [Mimi::Messaging::Message]
93
93
  # @param opts [Hash] additional options
94
94
  #
@@ -23,21 +23,39 @@ module Mimi
23
23
  def stop
24
24
  end
25
25
 
26
+ # Sends COMMAND to target
27
+ #
28
+ # @param target [String]
29
+ # @param message [Mimi::Messaging::Message]
30
+ # @param opts [Hash]
31
+ #
26
32
  def command(target, message, opts = {})
27
- message_serialized = serialize(message)
28
- dispatch_command(target, message_serialized, opts)
33
+ raise ArgumentError, "Message is expected" unless message.is_a?(Mimi::Messaging::Message)
34
+ dispatch_command(target, message, opts)
29
35
  nil
30
36
  end
31
37
 
38
+ # Sends QUERY to target
39
+ #
40
+ # @param target [String]
41
+ # @param message [Mimi::Messaging::Message]
42
+ # @param opts [Hash]
43
+ #
32
44
  def query(target, message, opts = {})
33
- message_serialized = serialize(message)
34
- response_serialized = dispatch_query(target, message_serialized, opts)
45
+ raise ArgumentError, "Message is expected" unless message.is_a?(Mimi::Messaging::Message)
46
+ response_serialized = dispatch_query(target, message, opts)
35
47
  deserialize(response_serialized)
36
48
  end
37
49
 
50
+ # Sends EVENT to target
51
+ #
52
+ # @param target [String]
53
+ # @param message [Mimi::Messaging::Message]
54
+ # @param opts [Hash]
55
+ #
38
56
  def event(target, message, opts = {})
39
- message_serialized = serialize(message)
40
- dispatch_event(target, message_serialized, opts)
57
+ raise ArgumentError, "Message is expected" unless message.is_a?(Mimi::Messaging::Message)
58
+ dispatch_event(target, message, opts)
41
59
  end
42
60
 
43
61
  def start_request_processor(queue_name, processor, _opts = {})
@@ -67,38 +85,48 @@ module Mimi
67
85
 
68
86
  private
69
87
 
70
- def dispatch_command(target, message_serialized, _opts = {})
88
+ # Simulates a transmitted message, following serialization/deserialization:
89
+ # message out -> message in
90
+ #
91
+ # @param message [Mimi::Messaging::Message]
92
+ # @return [Mimi::Messaging::Message]
93
+ #
94
+ def transmitted_message(message)
95
+ Mimi::Messaging::Message.new(
96
+ deserialize(serialize(message)),
97
+ message.headers
98
+ )
99
+ end
100
+
101
+ def dispatch_command(target, message, _opts = {})
71
102
  queue_name, method_name = target.split("/")
72
- message = deserialize(message_serialized)
73
103
  return unless request_processors[queue_name]
74
104
 
75
105
  # pick random processor serving the target
76
106
  processor = request_processors[queue_name].sample
77
- processor.call_command(method_name, message, {})
107
+ processor.call_command(method_name, transmitted_message(message), {})
78
108
  end
79
109
 
80
- def dispatch_query(target, message_serialized, _opts = {})
110
+ def dispatch_query(target, message, _opts = {})
81
111
  queue_name, method_name = target.split("/")
82
- message = deserialize(message_serialized)
83
112
  raise Timeout::Error unless request_processors[queue_name]
84
113
 
85
114
  # pick random processor serving the target
86
115
  processor = request_processors[queue_name].sample
87
- response = processor.call_query(method_name, message, {})
116
+ response = processor.call_query(method_name, transmitted_message(message), {})
88
117
  serialize(response)
89
118
  end
90
119
 
91
120
  def dispatch_event(target, message_serialized, _opts = {})
92
- topic_name, event_type = target.split("/")
121
+ topic_name, event_type = target.split("#")
93
122
  processors = event_processors[topic_name] || []
94
123
  processor_queues = event_processors_with_queue[topic_name] || {}
95
124
  processor_queues.values.each do |same_queue_processors|
96
125
  processors << same_queue_processors.sample
97
126
  end
98
127
 
99
- message = deserialize(message_serialized)
100
128
  processors.each do |processor|
101
- processor.call_event(event_type, message, {})
129
+ processor.call_event(event_type, transmitted_message(message), {})
102
130
  end
103
131
  end
104
132
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Mimi
4
4
  module Messaging
5
- VERSION = "1.1.1"
5
+ VERSION = "1.2.6"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mimi-messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kukushkin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-08 00:00:00.000000000 Z
11
+ date: 2019-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mimi-core