Skip to content

Commit fb5c94e

Browse files
authored
Merge pull request #127 from cookpad/errm/outbox_message_bus
Add a message bus for transactional outbox deliveries
2 parents 2c66bb8 + abd1ba1 commit fb5c94e

File tree

5 files changed

+126
-0
lines changed

5 files changed

+126
-0
lines changed

lib/streamy/event_handler.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require "active_support/core_ext/hash/indifferent_access"
2+
require "ostruct"
23

34
module Streamy
45
class EventHandler
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
require "streamy/kafka_configuration"
2+
require "waterdrop"
3+
require "active_support/core_ext/hash/indifferent_access"
4+
require "active_support/json"
5+
6+
module Streamy
7+
module MessageBuses
8+
class OutboxMessageBus < MessageBus
9+
def initialize(config)
10+
@model = config[:model]
11+
end
12+
13+
def deliver(key:, topic:, payload:, priority:)
14+
@model.create(key: key, topic: topic, payload: payload)
15+
end
16+
17+
def deliver_many(messages)
18+
@model.create(messages.map { |message| message.except(:priority) })
19+
end
20+
end
21+
end
22+
end

streamy.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
4545
spec.add_dependency "avro_turf", "~> 1.3.0"
4646
spec.add_dependency "waterdrop", ">= 2.4.10", "< 3.0.0"
4747
spec.add_dependency "webmock", "~> 3.3"
48+
spec.add_dependency "ostruct"
4849
end

test/avro_deserializer_test.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require "test_helper"
22
require "avro_turf/test/fake_confluent_schema_registry_server"
33
require "webmock/minitest"
4+
require "ostruct"
45

56
module Streamy
67
class AvroDeserializerTest < Minitest::Test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
require "test_helper"
2+
require "waterdrop"
3+
require "streamy/message_buses/outbox_message_bus"
4+
5+
module Streamy
6+
class OutboxMessageBusTest < Minitest::Test
7+
attr_reader :bus
8+
9+
def setup
10+
@model = mock("outbox_model")
11+
@bus = MessageBuses::OutboxMessageBus.new(model: @model)
12+
end
13+
14+
def example_delivery(priority)
15+
bus.deliver(
16+
payload: payload.to_s,
17+
key: "prk-sg-001",
18+
topic: "charcuterie",
19+
priority: priority
20+
)
21+
end
22+
23+
def payload
24+
{
25+
type: "sausage",
26+
body: { meat: "pork", herbs: "sage" },
27+
event_time: "2018"
28+
}
29+
end
30+
31+
def expected_event(key: "prk-sg-001")
32+
{
33+
payload: {
34+
type: "sausage",
35+
body: {
36+
meat: "pork",
37+
herbs: "sage"
38+
},
39+
event_time: "2018"
40+
}.to_s,
41+
key: key,
42+
topic: "charcuterie"
43+
}
44+
end
45+
46+
def test_standard_priority_deliver
47+
@model.expects(:create).with(expected_event)
48+
example_delivery(:standard)
49+
end
50+
51+
def test_low_priority_deliver
52+
@model.expects(:create).with(expected_event)
53+
example_delivery(:low)
54+
end
55+
56+
def test_essential_priority_deliver
57+
@model.expects(:create).with(expected_event)
58+
example_delivery(:essential)
59+
end
60+
61+
def test_all_priority_delivery
62+
@model.expects(:create).with(expected_event)
63+
example_delivery(:essential)
64+
65+
@model.expects(:create).with(expected_event)
66+
example_delivery(:low)
67+
68+
@model.expects(:create).with(expected_event)
69+
example_delivery(:standard)
70+
end
71+
72+
def test_batch_delivery
73+
@model.expects(:create).with([
74+
expected_event(key: "prk-sg-001"),
75+
expected_event(key: "prk-sg-002"),
76+
expected_event(key: "prk-sg-003")
77+
])
78+
79+
bus.deliver_many([
80+
{
81+
payload: payload.to_s,
82+
key: "prk-sg-001",
83+
topic: "charcuterie",
84+
priority: :standard
85+
},
86+
{
87+
payload: payload.to_s,
88+
key: "prk-sg-002",
89+
topic: "charcuterie",
90+
priority: :standard
91+
},
92+
{
93+
payload: payload.to_s,
94+
key: "prk-sg-003",
95+
topic: "charcuterie",
96+
priority: :standard
97+
}
98+
])
99+
end
100+
end
101+
end

0 commit comments

Comments
 (0)