Skip to content

Commit d11f033

Browse files
committed
Add RES append benchmarks
- Add three Rails Event Store append scenarios to compare its throughput against En57: - res-append-stream-any: single-thread append with expected_version :any. - res-concurrent-append-non-conflicting-streams: concurrent append to distinct streams. - res-concurrent-append-conflicting-streams: concurrent append to one stream with integer expected_version, retrying on conflict. - Pull in rails_event_store and rails as dependencies. - Seed the RES event_store_events schema from a dedicated SQL dump registered in database.toml.
1 parent 824506e commit d11f033

9 files changed

Lines changed: 624 additions & 0 deletions

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@ gem "syntax_tree"
2020
gem "activerecord"
2121
gem "sequel"
2222
gem "connection_pool"
23+
gem "rails_event_store"
24+
gem "rails"

Gemfile.lock

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,67 @@ PATH
77
GEM
88
remote: https://rubygems.org/
99
specs:
10+
action_text-trix (2.1.19)
11+
railties
12+
actioncable (8.1.3)
13+
actionpack (= 8.1.3)
14+
activesupport (= 8.1.3)
15+
nio4r (~> 2.0)
16+
websocket-driver (>= 0.6.1)
17+
zeitwerk (~> 2.6)
18+
actionmailbox (8.1.3)
19+
actionpack (= 8.1.3)
20+
activejob (= 8.1.3)
21+
activerecord (= 8.1.3)
22+
activestorage (= 8.1.3)
23+
activesupport (= 8.1.3)
24+
mail (>= 2.8.0)
25+
actionmailer (8.1.3)
26+
actionpack (= 8.1.3)
27+
actionview (= 8.1.3)
28+
activejob (= 8.1.3)
29+
activesupport (= 8.1.3)
30+
mail (>= 2.8.0)
31+
rails-dom-testing (~> 2.2)
32+
actionpack (8.1.3)
33+
actionview (= 8.1.3)
34+
activesupport (= 8.1.3)
35+
nokogiri (>= 1.8.5)
36+
rack (>= 2.2.4)
37+
rack-session (>= 1.0.1)
38+
rack-test (>= 0.6.3)
39+
rails-dom-testing (~> 2.2)
40+
rails-html-sanitizer (~> 1.6)
41+
useragent (~> 0.16)
42+
actiontext (8.1.3)
43+
action_text-trix (~> 2.1.15)
44+
actionpack (= 8.1.3)
45+
activerecord (= 8.1.3)
46+
activestorage (= 8.1.3)
47+
activesupport (= 8.1.3)
48+
globalid (>= 0.6.0)
49+
nokogiri (>= 1.8.5)
50+
actionview (8.1.3)
51+
activesupport (= 8.1.3)
52+
builder (~> 3.1)
53+
erubi (~> 1.11)
54+
rails-dom-testing (~> 2.2)
55+
rails-html-sanitizer (~> 1.6)
56+
activejob (8.1.3)
57+
activesupport (= 8.1.3)
58+
globalid (>= 0.3.6)
1059
activemodel (8.1.3)
1160
activesupport (= 8.1.3)
1261
activerecord (8.1.3)
1362
activemodel (= 8.1.3)
1463
activesupport (= 8.1.3)
1564
timeout (>= 0.4.0)
65+
activestorage (8.1.3)
66+
actionpack (= 8.1.3)
67+
activejob (= 8.1.3)
68+
activerecord (= 8.1.3)
69+
activesupport (= 8.1.3)
70+
marcel (~> 1.0)
1671
activesupport (8.1.3)
1772
base64
1873
bigdecimal
@@ -26,16 +81,25 @@ GEM
2681
securerandom (>= 0.3)
2782
tzinfo (~> 2.0, >= 2.0.5)
2883
uri (>= 0.13.1)
84+
aggregate_root (2.19.1)
85+
ruby_event_store (= 2.19.1)
86+
arkency-command_bus (0.4.1)
87+
concurrent-ruby
2988
ast (2.4.3)
3089
base64 (0.3.0)
3190
benchmark (0.5.0)
3291
bigdecimal (4.1.2)
92+
builder (3.3.0)
3393
concurrent-ruby (1.3.6)
3494
connection_pool (3.0.2)
95+
crass (1.0.6)
3596
date (3.5.1)
3697
diff-lcs (2.0.0)
3798
drb (2.2.3)
3899
erb (6.0.4)
100+
erubi (1.13.1)
101+
globalid (1.3.0)
102+
activesupport (>= 6.1)
39103
i18n (1.14.8)
40104
concurrent-ruby (~> 1.0)
41105
io-console (0.8.2)
@@ -46,8 +110,19 @@ GEM
46110
reline (>= 0.4.2)
47111
json (2.19.5)
48112
logger (1.7.0)
113+
loofah (2.25.1)
114+
crass (~> 1.0.2)
115+
nokogiri (>= 1.12.0)
49116
m (1.7.0)
50117
rake
118+
mail (2.9.0)
119+
logger
120+
mini_mime (>= 0.1.1)
121+
net-imap
122+
net-pop
123+
net-smtp
124+
marcel (1.2.1)
125+
mini_mime (1.1.5)
51126
minitest (6.0.6)
52127
drb (~> 2.0)
53128
prism (~> 1.5)
@@ -66,6 +141,22 @@ GEM
66141
mutant (= 0.16.3)
67142
mutex_m (~> 0.2)
68143
mutex_m (0.3.0)
144+
net-imap (0.6.4)
145+
date
146+
net-protocol
147+
net-pop (0.1.2)
148+
net-protocol
149+
net-protocol (0.2.2)
150+
timeout
151+
net-smtp (0.5.1)
152+
net-protocol
153+
nio4r (2.7.5)
154+
nokogiri (1.19.3-aarch64-linux-gnu)
155+
racc (~> 1.4)
156+
nokogiri (1.19.3-arm64-darwin)
157+
racc (~> 1.4)
158+
nokogiri (1.19.3-x86_64-linux-gnu)
159+
racc (~> 1.4)
69160
parser (3.3.11.1)
70161
ast (~> 2.4.1)
71162
racc
@@ -88,6 +179,55 @@ GEM
88179
date
89180
stringio
90181
racc (1.8.1)
182+
rack (3.2.6)
183+
rack-session (2.1.2)
184+
base64 (>= 0.1.0)
185+
rack (>= 3.0.0)
186+
rack-test (2.2.0)
187+
rack (>= 1.3)
188+
rackup (2.3.1)
189+
rack (>= 3)
190+
rails (8.1.3)
191+
actioncable (= 8.1.3)
192+
actionmailbox (= 8.1.3)
193+
actionmailer (= 8.1.3)
194+
actionpack (= 8.1.3)
195+
actiontext (= 8.1.3)
196+
actionview (= 8.1.3)
197+
activejob (= 8.1.3)
198+
activemodel (= 8.1.3)
199+
activerecord (= 8.1.3)
200+
activestorage (= 8.1.3)
201+
activesupport (= 8.1.3)
202+
bundler (>= 1.15.0)
203+
railties (= 8.1.3)
204+
rails-dom-testing (2.3.0)
205+
activesupport (>= 5.0.0)
206+
minitest
207+
nokogiri (>= 1.6)
208+
rails-html-sanitizer (1.7.0)
209+
loofah (~> 2.25)
210+
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
211+
rails_event_store (2.19.1)
212+
activejob (>= 6.0)
213+
activemodel (>= 6.0)
214+
activesupport (>= 6.0)
215+
aggregate_root (= 2.19.1)
216+
arkency-command_bus (>= 0.4)
217+
rails_event_store_active_record (= 2.19.1)
218+
ruby_event_store (= 2.19.1)
219+
ruby_event_store-browser (= 2.19.1)
220+
rails_event_store_active_record (2.19.1)
221+
ruby_event_store-active_record (= 2.19.1)
222+
railties (8.1.3)
223+
actionpack (= 8.1.3)
224+
activesupport (= 8.1.3)
225+
irb (~> 1.13)
226+
rackup (>= 1.0.0)
227+
rake (>= 12.2)
228+
thor (~> 1.0, >= 1.2.2)
229+
tsort (>= 0.2)
230+
zeitwerk (~> 2.6)
91231
rake (13.4.2)
92232
rdoc (7.2.0)
93233
erb
@@ -96,13 +236,22 @@ GEM
96236
regexp_parser (2.12.0)
97237
reline (0.6.3)
98238
io-console (~> 0.5)
239+
ruby_event_store (2.19.1)
240+
concurrent-ruby (~> 1.0, >= 1.1.6)
241+
ruby_event_store-active_record (2.19.1)
242+
activerecord (>= 6.0)
243+
ruby_event_store (= 2.19.1)
244+
ruby_event_store-browser (2.19.1)
245+
rack
246+
ruby_event_store (= 2.19.1)
99247
securerandom (0.4.1)
100248
sequel (5.104.0)
101249
bigdecimal
102250
sorbet-runtime (0.6.13222)
103251
stringio (3.2.0)
104252
syntax_tree (6.3.0)
105253
prettier_print (>= 1.2.0)
254+
thor (1.5.0)
106255
timeout (0.6.1)
107256
tsort (0.2.0)
108257
tzinfo (2.0.6)
@@ -112,6 +261,12 @@ GEM
112261
parser (>= 3.3.0)
113262
prism (>= 1.5.1)
114263
uri (1.1.1)
264+
useragent (0.16.11)
265+
websocket-driver (0.8.0)
266+
base64
267+
websocket-extensions (>= 0.1.0)
268+
websocket-extensions (0.1.5)
269+
zeitwerk (2.8.1)
115270

116271
PLATFORMS
117272
aarch64-linux
@@ -132,38 +287,67 @@ DEPENDENCIES
132287
minitest-stub-const
133288
mutant-minitest
134289
pg-ephemeral
290+
rails
291+
rails_event_store
135292
rake
136293
sequel
137294
syntax_tree
138295

139296
CHECKSUMS
297+
action_text-trix (2.1.19) sha256=7012f59421009cf284aa651294896414d653a61a2417c9b8714c8476d2f74009
298+
actioncable (8.1.3) sha256=e5bc7f75e44e6a22de29c4f43176927c3a9ce4824464b74ed18d8226e75a80f0
299+
actionmailbox (8.1.3) sha256=df7da474eaa0e70df4ed5a6fef66eb3b3b0f2dbf7f14518deee8d77f1b4aae59
300+
actionmailer (8.1.3) sha256=831f724891bb70d0aaa4d76581a6321124b6a752cb655c9346aae5479318448d
301+
actionpack (8.1.3) sha256=af998cae4d47c5d581a2cc363b5c77eb718b7c4b45748d81b1887b25621c29a3
302+
actiontext (8.1.3) sha256=d291019c00e1ea9e6463011fa214f6081a56d7b9a1d224e7d3f6384c1dafc7d2
303+
actionview (8.1.3) sha256=1347c88c7f3edb38100c5ce0e9fb5e62d7755f3edc1b61cce2eb0b2c6ea2fd5d
304+
activejob (8.1.3) sha256=a149b1766aa8204c3c3da7309e4becd40fcd5529c348cffbf6c9b16b565fe8d3
140305
activemodel (8.1.3) sha256=90c05cbe4cef3649b8f79f13016191ea94c4525ce4a5c0fb7ef909c4b91c8219
141306
activerecord (8.1.3) sha256=8003be7b2466ba0a2a670e603eeb0a61dd66058fccecfc49901e775260ac70ab
307+
activestorage (8.1.3) sha256=0564ce9309143951a67615e1bb4e090ee54b8befed417133cae614479b46384d
142308
activesupport (8.1.3) sha256=21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e
309+
aggregate_root (2.19.1) sha256=c387ee99a428944a08a96978e6ddf6ddb6ce93459d64955c0cb4f0766c110a2d
310+
arkency-command_bus (0.4.1) sha256=8acac50774080ecf6828ba2f953f1ae293e80878efd555267dbd61b2ee764bde
143311
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
144312
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
145313
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
146314
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
315+
builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
147316
bundler (4.0.11) sha256=5bcec0fb78302e48d02ee46f10ee6e6942be647ba5b44a6d1ddfda9a240ce785
148317
concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab
149318
connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
319+
crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
150320
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
151321
diff-lcs (2.0.0) sha256=708a5d52ec2945b50f8f53a181174aa1ef2c496edf81c05957fe956dabb363d5
152322
drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
153323
en57 (0.1.0)
154324
erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
325+
erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
326+
globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11
155327
i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
156328
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
157329
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
158330
json (2.19.5) sha256=218a18553e4801d579ca7e0f5bc72bafd776d7397238a1fb4e74db5b0a812c59
159331
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
332+
loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04
160333
m (1.7.0) sha256=058f793da8150c51353cc59366ffae7774683e868bede3c78f81d920fb9d633a
334+
mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941
335+
marcel (1.2.1) sha256=1678e9360e32f9eafa917c80029e2f6d10b2715c66a4b87b6d0da9b9cd1f859f
336+
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
161337
minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
162338
minitest-mock (5.27.0) sha256=7040ed7185417a966920987eaa6eaf1be4ea1fc5b25bb03ff4703f98564a55b0
163339
minitest-stub-const (0.6) sha256=b39f34dd6b8e7045fcc36820083aceaa68075318e4c4f365b12f11bd5f34b279
164340
mutant (0.16.3) sha256=7e10fb09b80a78d82f8e38283fc1e4d562cbb1392451e2a21611ea2bc44b5023
165341
mutant-minitest (0.16.3) sha256=504d110c1bd503528a7e57a4f062960e571bba4e3939e4a66ddc0f75d2071d90
166342
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
343+
net-imap (0.6.4) sha256=9a5598c67a3022c284d98430ef1d4948e7dbdb62596f61081ea8ca933270a02b
344+
net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
345+
net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
346+
net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
347+
nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
348+
nokogiri (1.19.3-aarch64-linux-gnu) sha256=46b89e5d7b9e844c2ee360794240c6ea2a4e6fa0c5892a4ed487db621224b639
349+
nokogiri (1.19.3-arm64-darwin) sha256=71b9bd424b1b7abc18b05052a1a3cfd3627abdca62be280854cc411791357e42
350+
nokogiri (1.19.3-x86_64-linux-gnu) sha256=2f5078620fe12e83669b5b17311b32532a8153d02eee7ad06948b926d6080976
167351
parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
168352
pg (1.6.3) sha256=1388d0563e13d2758c1089e35e973a3249e955c659592d10e5b77c468f628a99
169353
pg (1.6.3-aarch64-linux) sha256=0698ad563e02383c27510b76bf7d4cd2de19cd1d16a5013f375dd473e4be72ea
@@ -178,20 +362,38 @@ CHECKSUMS
178362
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
179363
psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
180364
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
365+
rack (3.2.6) sha256=5ed78e1f73b2e25679bec7d45ee2d4483cc4146eb1be0264fc4d94cb5ef212c2
366+
rack-session (2.1.2) sha256=595434f8c0c3473ae7d7ac56ecda6cc6dfd9d37c0b2b5255330aa1576967ffe8
367+
rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
368+
rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
369+
rails (8.1.3) sha256=6d017ba5348c98fc909753a8169b21d44de14d2a0b92d140d1a966834c3c9cd3
370+
rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
371+
rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89
372+
rails_event_store (2.19.1) sha256=7e1d649958c65fee72cda4a50f271dc7e3e31503c9a48d1a15ad2ee5fdd84e10
373+
rails_event_store_active_record (2.19.1) sha256=e5ad7fe661ee802bbb144f9c39eceb16c9cf09d314605e6ef75cd7afcb76dfbf
374+
railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22
181375
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
182376
rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
183377
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
184378
reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
379+
ruby_event_store (2.19.1) sha256=2e5eb4da5dc822c7983d8b3346a92c0643f35825798bbdb8bdcebb78f5be76eb
380+
ruby_event_store-active_record (2.19.1) sha256=f23b59183d4e310354bac53f83e7d165c22ab226503b88f313d491f39f727d3c
381+
ruby_event_store-browser (2.19.1) sha256=8a0ccdb80c942a8abc4a2e872c3345fb98308a371f11b08dc73f4f1909bab694
185382
securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
186383
sequel (5.104.0) sha256=1521819b9204aa7f5c25b29fbb2a609ba3f6a82d2271f34f718e1169d31bf03e
187384
sorbet-runtime (0.6.13222) sha256=d064f7fc317e4c0ae4a4112588f390d28d60f7dcdd0df7772b0036fce86c28d1
188385
stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
189386
syntax_tree (6.3.0) sha256=56e25a9692c798ec94c5442fe94c5e94af76bef91edc8bb02052cbdecf35f13d
387+
thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
190388
timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb
191389
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
192390
tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
193391
unparser (0.9.0) sha256=4331f174a73a23b69250b13d47da3794ed1449711ee0f9ed8947dc020ba76067
194392
uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
393+
useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
394+
websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962
395+
websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
396+
zeitwerk (2.8.1) sha256=1c85e0f28954d68cd16e575da37f26846f609b68d80b5942ccfd31030c2449d5
195397

196398
BUNDLED WITH
197399
4.0.11

database.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,16 @@ path = "db/schema/0.1.0.sql"
3131
[instances.concurrent-append-conflicting-tags.seeds.schema]
3232
type = "sql-file"
3333
path = "db/schema/0.1.0.sql"
34+
35+
[instances.res-append-stream-any.seeds.schema]
36+
type = "sql-file"
37+
path = "db/seeds/res.sql"
38+
39+
[instances.res-concurrent-append-non-conflicting-streams.seeds.schema]
40+
type = "sql-file"
41+
path = "db/seeds/res.sql"
42+
43+
[instances.res-concurrent-append-conflicting-streams.seeds.schema]
44+
type = "sql-file"
45+
path = "db/seeds/res.sql"
46+

0 commit comments

Comments
 (0)