karafka 2.4.15 → 2.4.17

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.
Files changed (264) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/workflows/ci.yml +5 -5
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.md +15 -0
  6. data/Gemfile +1 -0
  7. data/Gemfile.lock +17 -14
  8. data/LICENSE +7 -2
  9. data/config/locales/errors.yml +1 -0
  10. data/docker-compose.yml +0 -2
  11. data/lib/karafka/base_consumer.rb +70 -16
  12. data/lib/karafka/connection/client.rb +2 -16
  13. data/lib/karafka/connection/rebalance_manager.rb +24 -13
  14. data/lib/karafka/instrumentation/logger_listener.rb +3 -0
  15. data/lib/karafka/instrumentation/notifications.rb +4 -0
  16. data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +1 -26
  17. data/lib/karafka/pro/active_job/consumer.rb +2 -10
  18. data/lib/karafka/pro/active_job/dispatcher.rb +2 -10
  19. data/lib/karafka/pro/active_job/job_options_contract.rb +2 -10
  20. data/lib/karafka/pro/base_consumer.rb +2 -10
  21. data/lib/karafka/pro/cleaner/errors.rb +2 -10
  22. data/lib/karafka/pro/cleaner/messages/message.rb +14 -12
  23. data/lib/karafka/pro/cleaner/messages/messages.rb +2 -10
  24. data/lib/karafka/pro/cleaner/messages/metadata.rb +41 -0
  25. data/lib/karafka/pro/cleaner.rb +3 -10
  26. data/lib/karafka/pro/connection/manager.rb +2 -10
  27. data/lib/karafka/pro/connection/multiplexing/listener.rb +2 -10
  28. data/lib/karafka/pro/contracts/base.rb +2 -10
  29. data/lib/karafka/pro/contracts/server_cli_options.rb +2 -10
  30. data/lib/karafka/pro/encryption/cipher.rb +2 -10
  31. data/lib/karafka/pro/encryption/contracts/config.rb +2 -10
  32. data/lib/karafka/pro/encryption/errors.rb +2 -10
  33. data/lib/karafka/pro/encryption/messages/middleware.rb +2 -10
  34. data/lib/karafka/pro/encryption/messages/parser.rb +2 -10
  35. data/lib/karafka/pro/encryption/setup/config.rb +2 -10
  36. data/lib/karafka/pro/encryption.rb +2 -10
  37. data/lib/karafka/pro/instrumentation/performance_tracker.rb +2 -10
  38. data/lib/karafka/pro/iterator/expander.rb +2 -10
  39. data/lib/karafka/pro/iterator/tpl_builder.rb +2 -10
  40. data/lib/karafka/pro/iterator.rb +2 -10
  41. data/lib/karafka/pro/loader.rb +2 -10
  42. data/lib/karafka/pro/processing/adaptive_iterator/consumer.rb +2 -10
  43. data/lib/karafka/pro/processing/adaptive_iterator/tracker.rb +2 -10
  44. data/lib/karafka/pro/processing/collapser.rb +2 -10
  45. data/lib/karafka/pro/processing/coordinator.rb +2 -10
  46. data/lib/karafka/pro/processing/coordinators/errors_tracker.rb +2 -10
  47. data/lib/karafka/pro/processing/coordinators/filters_applier.rb +2 -10
  48. data/lib/karafka/pro/processing/coordinators/virtual_offset_manager.rb +2 -10
  49. data/lib/karafka/pro/processing/executor.rb +2 -10
  50. data/lib/karafka/pro/processing/expansions_selector.rb +2 -10
  51. data/lib/karafka/pro/processing/filters/base.rb +2 -10
  52. data/lib/karafka/pro/processing/filters/delayer.rb +2 -10
  53. data/lib/karafka/pro/processing/filters/expirer.rb +2 -10
  54. data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +2 -10
  55. data/lib/karafka/pro/processing/filters/throttler.rb +2 -10
  56. data/lib/karafka/pro/processing/filters/virtual_limiter.rb +2 -10
  57. data/lib/karafka/pro/processing/jobs/consume_non_blocking.rb +4 -10
  58. data/lib/karafka/pro/processing/jobs/eofed_non_blocking.rb +4 -10
  59. data/lib/karafka/pro/processing/jobs/periodic.rb +4 -10
  60. data/lib/karafka/pro/processing/jobs/periodic_non_blocking.rb +4 -10
  61. data/lib/karafka/pro/processing/jobs/revoked_non_blocking.rb +4 -10
  62. data/lib/karafka/pro/processing/jobs_builder.rb +2 -10
  63. data/lib/karafka/pro/processing/jobs_queue.rb +2 -10
  64. data/lib/karafka/pro/processing/offset_metadata/consumer.rb +2 -10
  65. data/lib/karafka/pro/processing/offset_metadata/fetcher.rb +2 -10
  66. data/lib/karafka/pro/processing/offset_metadata/listener.rb +2 -10
  67. data/lib/karafka/pro/processing/partitioner.rb +2 -10
  68. data/lib/karafka/pro/processing/periodic_job/consumer.rb +2 -10
  69. data/lib/karafka/pro/processing/piping/consumer.rb +2 -10
  70. data/lib/karafka/pro/processing/schedulers/base.rb +2 -10
  71. data/lib/karafka/pro/processing/schedulers/default.rb +2 -10
  72. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +3 -11
  73. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +3 -11
  74. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom.rb +2 -10
  75. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom_vp.rb +2 -10
  76. data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom.rb +3 -11
  77. data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom_vp.rb +3 -11
  78. data/lib/karafka/pro/processing/strategies/aj/dlq_mom.rb +2 -10
  79. data/lib/karafka/pro/processing/strategies/aj/dlq_mom_vp.rb +2 -10
  80. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom.rb +2 -10
  81. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +3 -11
  82. data/lib/karafka/pro/processing/strategies/aj/ftr_mom.rb +2 -10
  83. data/lib/karafka/pro/processing/strategies/aj/ftr_mom_vp.rb +2 -10
  84. data/lib/karafka/pro/processing/strategies/aj/lrj_mom.rb +2 -10
  85. data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +5 -13
  86. data/lib/karafka/pro/processing/strategies/aj/mom.rb +2 -10
  87. data/lib/karafka/pro/processing/strategies/aj/mom_vp.rb +2 -10
  88. data/lib/karafka/pro/processing/strategies/base.rb +2 -10
  89. data/lib/karafka/pro/processing/strategies/default.rb +135 -77
  90. data/lib/karafka/pro/processing/strategies/dlq/default.rb +6 -14
  91. data/lib/karafka/pro/processing/strategies/dlq/ftr.rb +2 -10
  92. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +3 -11
  93. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +3 -11
  94. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom_vp.rb +2 -10
  95. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_vp.rb +2 -10
  96. data/lib/karafka/pro/processing/strategies/dlq/ftr_mom.rb +3 -11
  97. data/lib/karafka/pro/processing/strategies/dlq/ftr_mom_vp.rb +2 -10
  98. data/lib/karafka/pro/processing/strategies/dlq/ftr_vp.rb +2 -10
  99. data/lib/karafka/pro/processing/strategies/dlq/lrj.rb +3 -11
  100. data/lib/karafka/pro/processing/strategies/dlq/lrj_mom.rb +3 -11
  101. data/lib/karafka/pro/processing/strategies/dlq/lrj_mom_vp.rb +2 -10
  102. data/lib/karafka/pro/processing/strategies/dlq/lrj_vp.rb +2 -10
  103. data/lib/karafka/pro/processing/strategies/dlq/mom.rb +3 -11
  104. data/lib/karafka/pro/processing/strategies/dlq/mom_vp.rb +2 -10
  105. data/lib/karafka/pro/processing/strategies/dlq/vp.rb +2 -10
  106. data/lib/karafka/pro/processing/strategies/ftr/default.rb +4 -12
  107. data/lib/karafka/pro/processing/strategies/ftr/vp.rb +2 -10
  108. data/lib/karafka/pro/processing/strategies/lrj/default.rb +5 -13
  109. data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +3 -11
  110. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +2 -10
  111. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom_vp.rb +2 -10
  112. data/lib/karafka/pro/processing/strategies/lrj/ftr_vp.rb +2 -10
  113. data/lib/karafka/pro/processing/strategies/lrj/mom.rb +4 -12
  114. data/lib/karafka/pro/processing/strategies/lrj/mom_vp.rb +2 -10
  115. data/lib/karafka/pro/processing/strategies/lrj/vp.rb +2 -10
  116. data/lib/karafka/pro/processing/strategies/mom/default.rb +2 -10
  117. data/lib/karafka/pro/processing/strategies/mom/ftr.rb +2 -10
  118. data/lib/karafka/pro/processing/strategies/mom/ftr_vp.rb +2 -10
  119. data/lib/karafka/pro/processing/strategies/mom/vp.rb +2 -10
  120. data/lib/karafka/pro/processing/strategies/vp/default.rb +5 -10
  121. data/lib/karafka/pro/processing/strategies.rb +2 -10
  122. data/lib/karafka/pro/processing/strategy_selector.rb +2 -10
  123. data/lib/karafka/pro/processing/subscription_groups_coordinator.rb +2 -10
  124. data/lib/karafka/pro/recurring_tasks/consumer.rb +2 -10
  125. data/lib/karafka/pro/recurring_tasks/contracts/config.rb +2 -10
  126. data/lib/karafka/pro/recurring_tasks/contracts/task.rb +2 -10
  127. data/lib/karafka/pro/recurring_tasks/deserializer.rb +2 -10
  128. data/lib/karafka/pro/recurring_tasks/dispatcher.rb +2 -10
  129. data/lib/karafka/pro/recurring_tasks/errors.rb +2 -10
  130. data/lib/karafka/pro/recurring_tasks/executor.rb +2 -10
  131. data/lib/karafka/pro/recurring_tasks/listener.rb +2 -10
  132. data/lib/karafka/pro/recurring_tasks/matcher.rb +2 -10
  133. data/lib/karafka/pro/recurring_tasks/schedule.rb +2 -10
  134. data/lib/karafka/pro/recurring_tasks/serializer.rb +2 -10
  135. data/lib/karafka/pro/recurring_tasks/setup/config.rb +2 -10
  136. data/lib/karafka/pro/recurring_tasks/task.rb +2 -10
  137. data/lib/karafka/pro/recurring_tasks.rb +2 -10
  138. data/lib/karafka/pro/routing/features/active_job/builder.rb +2 -10
  139. data/lib/karafka/pro/routing/features/active_job.rb +2 -10
  140. data/lib/karafka/pro/routing/features/adaptive_iterator/config.rb +2 -10
  141. data/lib/karafka/pro/routing/features/adaptive_iterator/contracts/topic.rb +2 -10
  142. data/lib/karafka/pro/routing/features/adaptive_iterator/topic.rb +2 -10
  143. data/lib/karafka/pro/routing/features/adaptive_iterator.rb +2 -10
  144. data/lib/karafka/pro/routing/features/base.rb +2 -10
  145. data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +2 -10
  146. data/lib/karafka/pro/routing/features/dead_letter_queue/topic.rb +2 -10
  147. data/lib/karafka/pro/routing/features/dead_letter_queue.rb +2 -10
  148. data/lib/karafka/pro/routing/features/delaying/config.rb +2 -10
  149. data/lib/karafka/pro/routing/features/delaying/contracts/topic.rb +2 -10
  150. data/lib/karafka/pro/routing/features/delaying/topic.rb +2 -10
  151. data/lib/karafka/pro/routing/features/delaying.rb +2 -10
  152. data/lib/karafka/pro/routing/features/direct_assignments/config.rb +2 -10
  153. data/lib/karafka/pro/routing/features/direct_assignments/contracts/consumer_group.rb +2 -10
  154. data/lib/karafka/pro/routing/features/direct_assignments/contracts/topic.rb +2 -10
  155. data/lib/karafka/pro/routing/features/direct_assignments/subscription_group.rb +2 -10
  156. data/lib/karafka/pro/routing/features/direct_assignments/topic.rb +2 -10
  157. data/lib/karafka/pro/routing/features/direct_assignments.rb +2 -10
  158. data/lib/karafka/pro/routing/features/expiring/config.rb +2 -10
  159. data/lib/karafka/pro/routing/features/expiring/contracts/topic.rb +2 -10
  160. data/lib/karafka/pro/routing/features/expiring/topic.rb +2 -10
  161. data/lib/karafka/pro/routing/features/expiring.rb +2 -10
  162. data/lib/karafka/pro/routing/features/filtering/config.rb +2 -10
  163. data/lib/karafka/pro/routing/features/filtering/contracts/topic.rb +2 -10
  164. data/lib/karafka/pro/routing/features/filtering/topic.rb +2 -10
  165. data/lib/karafka/pro/routing/features/filtering.rb +2 -10
  166. data/lib/karafka/pro/routing/features/inline_insights/config.rb +2 -10
  167. data/lib/karafka/pro/routing/features/inline_insights/contracts/topic.rb +2 -10
  168. data/lib/karafka/pro/routing/features/inline_insights/topic.rb +2 -10
  169. data/lib/karafka/pro/routing/features/inline_insights.rb +2 -10
  170. data/lib/karafka/pro/routing/features/long_running_job/config.rb +2 -10
  171. data/lib/karafka/pro/routing/features/long_running_job/contracts/topic.rb +2 -10
  172. data/lib/karafka/pro/routing/features/long_running_job/topic.rb +2 -10
  173. data/lib/karafka/pro/routing/features/long_running_job.rb +2 -10
  174. data/lib/karafka/pro/routing/features/multiplexing/config.rb +2 -10
  175. data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +2 -10
  176. data/lib/karafka/pro/routing/features/multiplexing/patches/contracts/consumer_group.rb +2 -10
  177. data/lib/karafka/pro/routing/features/multiplexing/proxy.rb +2 -10
  178. data/lib/karafka/pro/routing/features/multiplexing/subscription_group.rb +2 -10
  179. data/lib/karafka/pro/routing/features/multiplexing/subscription_groups_builder.rb +2 -10
  180. data/lib/karafka/pro/routing/features/multiplexing.rb +2 -10
  181. data/lib/karafka/pro/routing/features/non_blocking_job/topic.rb +2 -10
  182. data/lib/karafka/pro/routing/features/non_blocking_job.rb +2 -10
  183. data/lib/karafka/pro/routing/features/offset_metadata/config.rb +2 -10
  184. data/lib/karafka/pro/routing/features/offset_metadata/contracts/topic.rb +2 -10
  185. data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +2 -10
  186. data/lib/karafka/pro/routing/features/offset_metadata.rb +2 -10
  187. data/lib/karafka/pro/routing/features/patterns/builder.rb +2 -10
  188. data/lib/karafka/pro/routing/features/patterns/config.rb +2 -10
  189. data/lib/karafka/pro/routing/features/patterns/consumer_group.rb +2 -10
  190. data/lib/karafka/pro/routing/features/patterns/contracts/consumer_group.rb +2 -10
  191. data/lib/karafka/pro/routing/features/patterns/contracts/pattern.rb +2 -10
  192. data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +2 -10
  193. data/lib/karafka/pro/routing/features/patterns/detector.rb +2 -10
  194. data/lib/karafka/pro/routing/features/patterns/pattern.rb +2 -10
  195. data/lib/karafka/pro/routing/features/patterns/patterns.rb +2 -10
  196. data/lib/karafka/pro/routing/features/patterns/topic.rb +2 -10
  197. data/lib/karafka/pro/routing/features/patterns/topics.rb +2 -10
  198. data/lib/karafka/pro/routing/features/patterns.rb +2 -10
  199. data/lib/karafka/pro/routing/features/pausing/contracts/topic.rb +2 -10
  200. data/lib/karafka/pro/routing/features/pausing/topic.rb +2 -10
  201. data/lib/karafka/pro/routing/features/pausing.rb +2 -10
  202. data/lib/karafka/pro/routing/features/periodic_job/config.rb +2 -10
  203. data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +2 -10
  204. data/lib/karafka/pro/routing/features/periodic_job/topic.rb +2 -10
  205. data/lib/karafka/pro/routing/features/periodic_job.rb +2 -10
  206. data/lib/karafka/pro/routing/features/recurring_tasks/builder.rb +2 -10
  207. data/lib/karafka/pro/routing/features/recurring_tasks/config.rb +2 -10
  208. data/lib/karafka/pro/routing/features/recurring_tasks/contracts/topic.rb +2 -10
  209. data/lib/karafka/pro/routing/features/recurring_tasks/proxy.rb +2 -10
  210. data/lib/karafka/pro/routing/features/recurring_tasks/topic.rb +2 -10
  211. data/lib/karafka/pro/routing/features/recurring_tasks.rb +2 -10
  212. data/lib/karafka/pro/routing/features/scheduled_messages/builder.rb +2 -10
  213. data/lib/karafka/pro/routing/features/scheduled_messages/config.rb +2 -10
  214. data/lib/karafka/pro/routing/features/scheduled_messages/contracts/topic.rb +2 -10
  215. data/lib/karafka/pro/routing/features/scheduled_messages/proxy.rb +2 -10
  216. data/lib/karafka/pro/routing/features/scheduled_messages/topic.rb +2 -10
  217. data/lib/karafka/pro/routing/features/scheduled_messages.rb +2 -10
  218. data/lib/karafka/pro/routing/features/swarm/config.rb +2 -10
  219. data/lib/karafka/pro/routing/features/swarm/contracts/routing.rb +2 -10
  220. data/lib/karafka/pro/routing/features/swarm/contracts/topic.rb +2 -10
  221. data/lib/karafka/pro/routing/features/swarm/topic.rb +2 -10
  222. data/lib/karafka/pro/routing/features/swarm.rb +2 -10
  223. data/lib/karafka/pro/routing/features/throttling/config.rb +2 -10
  224. data/lib/karafka/pro/routing/features/throttling/contracts/topic.rb +2 -10
  225. data/lib/karafka/pro/routing/features/throttling/topic.rb +2 -10
  226. data/lib/karafka/pro/routing/features/throttling.rb +2 -10
  227. data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +2 -10
  228. data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +2 -10
  229. data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +2 -10
  230. data/lib/karafka/pro/routing/features/virtual_partitions.rb +2 -10
  231. data/lib/karafka/pro/scheduled_messages/consumer.rb +2 -10
  232. data/lib/karafka/pro/scheduled_messages/contracts/config.rb +2 -10
  233. data/lib/karafka/pro/scheduled_messages/contracts/message.rb +2 -10
  234. data/lib/karafka/pro/scheduled_messages/daily_buffer.rb +2 -10
  235. data/lib/karafka/pro/scheduled_messages/day.rb +2 -10
  236. data/lib/karafka/pro/scheduled_messages/deserializers/headers.rb +2 -10
  237. data/lib/karafka/pro/scheduled_messages/deserializers/payload.rb +2 -10
  238. data/lib/karafka/pro/scheduled_messages/dispatcher.rb +2 -10
  239. data/lib/karafka/pro/scheduled_messages/errors.rb +2 -10
  240. data/lib/karafka/pro/scheduled_messages/max_epoch.rb +2 -10
  241. data/lib/karafka/pro/scheduled_messages/proxy.rb +2 -10
  242. data/lib/karafka/pro/scheduled_messages/schema_validator.rb +2 -10
  243. data/lib/karafka/pro/scheduled_messages/serializer.rb +2 -10
  244. data/lib/karafka/pro/scheduled_messages/setup/config.rb +2 -10
  245. data/lib/karafka/pro/scheduled_messages/state.rb +2 -10
  246. data/lib/karafka/pro/scheduled_messages/tracker.rb +2 -10
  247. data/lib/karafka/pro/scheduled_messages.rb +2 -10
  248. data/lib/karafka/pro/swarm/liveness_listener.rb +2 -10
  249. data/lib/karafka/processing/executor.rb +7 -0
  250. data/lib/karafka/processing/jobs/base.rb +13 -0
  251. data/lib/karafka/processing/jobs/consume.rb +2 -0
  252. data/lib/karafka/processing/jobs/eofed.rb +2 -0
  253. data/lib/karafka/processing/jobs/idle.rb +2 -0
  254. data/lib/karafka/processing/jobs/revoked.rb +2 -0
  255. data/lib/karafka/processing/jobs/shutdown.rb +2 -0
  256. data/lib/karafka/processing/strategies/aj_dlq_mom.rb +1 -1
  257. data/lib/karafka/processing/strategies/default.rb +28 -17
  258. data/lib/karafka/processing/strategies/dlq.rb +4 -4
  259. data/lib/karafka/processing/strategies/dlq_mom.rb +2 -2
  260. data/lib/karafka/processing/worker.rb +21 -18
  261. data/lib/karafka/version.rb +1 -1
  262. data.tar.gz.sig +0 -0
  263. metadata +4 -6
  264. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b49de31147b2a64d8927c91e25e6b607fdf1a8a7280b7cc3ba8c3663cf96b6f
4
- data.tar.gz: 4a3d9e439e21b79b9ac6a2c8bf4e76219f970be1f6bb7316feb5c7f2f792271e
3
+ metadata.gz: a26065fae7fe2d8f878b56e497d3551f3f0277b27ed3356b59fd478f017b4144
4
+ data.tar.gz: 356d0e078a32f0b22dc7d06d0f0e896d17b55e7a52866acf92933aeb6a611548
5
5
  SHA512:
6
- metadata.gz: 527a1c169ddc5a0f978f69dc3dbae6d30288997d2cfc95104ad6343d7a468c67afbde4c55051c1e7902d2c161fc1e615f8d703b9dfba123f734b9fbd7ccec5d1
7
- data.tar.gz: a895657a8dece0c9bdb65afeeb00bc8df2e03e1957d345bc71ceab9d6cce74e5d0b4afcc251e26dfe230778a05b8742e40505a779695325844c6be630307ad82
6
+ metadata.gz: 1043bb3ff799cc5294de4936552f4dcc3a78f9aabca275fd35259c87dfdc257cc63a778722d833c8a1f3e9449084e6266e6cd507d396cd92457b8e6078ced631
7
+ data.tar.gz: 57fe56b280f460be5f3fe2a734587d75ad08e25ae96363da68d5791fe62b6427402de400e6cae2e38660bbcefdb314be45d0299d15c50131a1ebe15f44c23c96
checksums.yaml.gz.sig CHANGED
Binary file
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Set up Ruby
28
28
  uses: ruby/setup-ruby@v1
29
29
  with:
30
- ruby-version: 3.3
30
+ ruby-version: 3.4
31
31
  bundler-cache: true
32
32
 
33
33
  - name: Install Diffend plugin
@@ -73,12 +73,12 @@ jobs:
73
73
  fail-fast: false
74
74
  matrix:
75
75
  ruby:
76
- - '3.4.0-preview1'
76
+ - '3.4'
77
77
  - '3.3'
78
78
  - '3.2'
79
79
  - '3.1'
80
80
  include:
81
- - ruby: '3.3'
81
+ - ruby: '3.4'
82
82
  coverage: 'true'
83
83
  steps:
84
84
  - uses: actions/checkout@v4
@@ -120,7 +120,7 @@ jobs:
120
120
  fail-fast: false
121
121
  matrix:
122
122
  ruby:
123
- - '3.4.0-preview1'
123
+ - '3.4'
124
124
  - '3.3'
125
125
  - '3.2'
126
126
  - '3.1'
@@ -178,7 +178,7 @@ jobs:
178
178
  fail-fast: false
179
179
  matrix:
180
180
  ruby:
181
- - '3.4.0-preview1'
181
+ - '3.4'
182
182
  - '3.3'
183
183
  - '3.2'
184
184
  - '3.1'
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.6
1
+ 3.4.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Karafka Framework Changelog
2
2
 
3
+ ## 2.4.17 (2025-01-15)
4
+ - [Enhancement] Clean message key and headers when cleaning messages via the cleaner API (Pro).
5
+ - [Enhancement] Allow for setting `metadata: false` in the cleaner API for granular cleaning control (Pro)
6
+ - [Enhancement] Instrument successful transaction via `consumer.consuming.transaction` event (Pro).
7
+
8
+ ## 2.4.16 (2024-12-27)
9
+ - [Enhancement] Improve post-rebalance revocation messages filtering.
10
+ - [Enhancement] Introduce `Consumer#wrap` for connection pooling management and other wrapped operations.
11
+ - [Enhancement] Guard transactional operations from marking beyond assignment ownership under some extreme edge-cases.
12
+ - [Enhancement] Improve VPs work with transactional producers.
13
+ - [Enhancement] Prevent non-transactional operations leakage into transactional managed offset management consumers.
14
+ - [Fix] Prevent transactions from being marked with a non-transactional default producer when automatic offset management and other advanced features are on.
15
+ - [Fix] Fix `kafka_format` `KeyError` that occurs when a non-hash is assigned to the kafka scope of the settings.
16
+ - [Fix] Non cooperative-sticky transactional offset management can refetch reclaimed partitions.
17
+
3
18
  ## 2.4.15 (2024-12-04)
4
19
  - [Fix] Assignment tracker current state fetch during a rebalance loop can cause an error on multi CG setup.
5
20
  - [Fix] Prevent double post-transaction offset dispatch to Kafka.
data/Gemfile CHANGED
@@ -12,6 +12,7 @@ gemspec
12
12
  group :integrations, :test do
13
13
  gem 'fugit', require: false
14
14
  gem 'rspec', require: false
15
+ gem 'stringio'
15
16
  end
16
17
 
17
18
  group :integrations do
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka (2.4.15)
4
+ karafka (2.4.17)
5
5
  base64 (~> 0.2)
6
6
  karafka-core (>= 2.4.4, < 2.5.0)
7
7
  karafka-rdkafka (>= 0.17.2)
@@ -11,10 +11,10 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activejob (8.0.0)
15
- activesupport (= 8.0.0)
14
+ activejob (8.0.1)
15
+ activesupport (= 8.0.1)
16
16
  globalid (>= 0.3.6)
17
- activesupport (8.0.0)
17
+ activesupport (8.0.1)
18
18
  base64
19
19
  benchmark (>= 0.3)
20
20
  bigdecimal
@@ -49,9 +49,10 @@ GEM
49
49
  activesupport (>= 6.1)
50
50
  i18n (1.14.6)
51
51
  concurrent-ruby (~> 1.0)
52
- karafka-core (2.4.5)
53
- karafka-rdkafka (>= 0.17.6, < 0.18.0)
54
- karafka-rdkafka (0.17.6)
52
+ karafka-core (2.4.8)
53
+ karafka-rdkafka (>= 0.17.6, < 0.19.0)
54
+ logger (>= 1.6.0)
55
+ karafka-rdkafka (0.18.1)
55
56
  ffi (~> 1.15)
56
57
  mini_portile2 (~> 2.6)
57
58
  rake (> 12)
@@ -64,9 +65,9 @@ GEM
64
65
  karafka-core (>= 2.4.0, < 2.5.0)
65
66
  roda (~> 3.68, >= 3.69)
66
67
  tilt (~> 2.0)
67
- logger (1.6.1)
68
+ logger (1.6.3)
68
69
  mini_portile2 (2.8.8)
69
- minitest (5.25.1)
70
+ minitest (5.25.4)
70
71
  ostruct (0.6.1)
71
72
  raabro (1.4.0)
72
73
  rack (3.1.8)
@@ -86,22 +87,23 @@ GEM
86
87
  diff-lcs (>= 1.2.0, < 2.0)
87
88
  rspec-support (~> 3.13.0)
88
89
  rspec-support (3.13.1)
89
- securerandom (0.3.1)
90
+ securerandom (0.3.2)
90
91
  simplecov (0.22.0)
91
92
  docile (~> 1.1)
92
93
  simplecov-html (~> 0.11)
93
94
  simplecov_json_formatter (~> 0.1)
94
95
  simplecov-html (0.12.3)
95
96
  simplecov_json_formatter (0.1.4)
97
+ stringio (3.1.2)
96
98
  tilt (2.4.0)
97
99
  tzinfo (2.0.6)
98
100
  concurrent-ruby (~> 1.0)
99
- uri (1.0.0)
100
- waterdrop (2.8.0)
101
+ uri (1.0.2)
102
+ waterdrop (2.8.1)
101
103
  karafka-core (>= 2.4.3, < 3.0.0)
102
104
  karafka-rdkafka (>= 0.17.5)
103
105
  zeitwerk (~> 2.3)
104
- zeitwerk (2.6.18)
106
+ zeitwerk (2.7.1)
105
107
 
106
108
  PLATFORMS
107
109
  ruby
@@ -118,6 +120,7 @@ DEPENDENCIES
118
120
  ostruct
119
121
  rspec
120
122
  simplecov
123
+ stringio
121
124
 
122
125
  BUNDLED WITH
123
- 2.4.22
126
+ 2.6.2
data/LICENSE CHANGED
@@ -6,8 +6,13 @@ for license text.
6
6
 
7
7
  Karafka has also commercial-friendly license, commercial support and commercial components.
8
8
 
9
- All of the commercial components are present in the lib/karafka/pro directory of this repository
10
- and their usage requires commercial license agreement.
9
+ All of the commercial components are present in the:
10
+
11
+ - `lib/karafka/pro`
12
+ - `spec/lib/karafka/pro`
13
+ - `spec/integrations/pro`
14
+
15
+ directories of this repository and their usage requires commercial license agreement.
11
16
 
12
17
  By sending a pull request to the pro components, you are agreeing to transfer the copyright of your
13
18
  code to Maciej Mensfeld.
@@ -95,6 +95,7 @@ en:
95
95
 
96
96
  topic:
97
97
  kafka: needs to be a hash with kafka scope settings details
98
+ kafka_format: needs to be a filled hash
98
99
  missing: needs to be present
99
100
  max_messages_format: 'needs to be an integer bigger than 0'
100
101
  max_wait_time_format: 'needs to be an integer bigger than 0'
data/docker-compose.yml CHANGED
@@ -1,5 +1,3 @@
1
- version: '2'
2
-
3
1
  services:
4
2
  kafka:
5
3
  container_name: kafka
@@ -6,10 +6,13 @@ module Karafka
6
6
  class BaseConsumer
7
7
  # Allow for consumer instance tagging for instrumentation
8
8
  include ::Karafka::Core::Taggable
9
+ include Helpers::ConfigImporter.new(
10
+ monitor: %i[monitor]
11
+ )
9
12
 
10
13
  extend Forwardable
11
14
 
12
- def_delegators :@coordinator, :topic, :partition, :eofed?
15
+ def_delegators :@coordinator, :topic, :partition, :eofed?, :seek_offset, :seek_offset=
13
16
 
14
17
  def_delegators :producer, :produce_async, :produce_sync, :produce_many_async,
15
18
  :produce_many_sync
@@ -39,7 +42,7 @@ module Karafka
39
42
  def on_initialized
40
43
  handle_initialized
41
44
  rescue StandardError => e
42
- Karafka.monitor.instrument(
45
+ monitor.instrument(
43
46
  'error.occurred',
44
47
  error: e,
45
48
  caller: self,
@@ -73,6 +76,23 @@ module Karafka
73
76
  handle_before_consume
74
77
  end
75
78
 
79
+ # Executes the default wrapping flow
80
+ #
81
+ # @private
82
+ #
83
+ # @param action [Symbol]
84
+ # @param block [Proc]
85
+ def on_wrap(action, &block)
86
+ handle_wrap(action, &block)
87
+ rescue StandardError => e
88
+ monitor.instrument(
89
+ 'error.occurred',
90
+ error: e,
91
+ caller: self,
92
+ type: 'consumer.wrap.error'
93
+ )
94
+ end
95
+
76
96
  # Executes the default consumer flow.
77
97
  #
78
98
  # @private
@@ -85,11 +105,11 @@ module Karafka
85
105
  def on_consume
86
106
  handle_consume
87
107
  rescue StandardError => e
88
- Karafka.monitor.instrument(
108
+ monitor.instrument(
89
109
  'error.occurred',
90
110
  error: e,
91
111
  caller: self,
92
- seek_offset: coordinator.seek_offset,
112
+ seek_offset: seek_offset,
93
113
  type: 'consumer.consume.error'
94
114
  )
95
115
  end
@@ -105,11 +125,11 @@ module Karafka
105
125
  def on_after_consume
106
126
  handle_after_consume
107
127
  rescue StandardError => e
108
- Karafka.monitor.instrument(
128
+ monitor.instrument(
109
129
  'error.occurred',
110
130
  error: e,
111
131
  caller: self,
112
- seek_offset: coordinator.seek_offset,
132
+ seek_offset: seek_offset,
113
133
  type: 'consumer.after_consume.error'
114
134
  )
115
135
 
@@ -125,11 +145,11 @@ module Karafka
125
145
  def on_eofed
126
146
  handle_eofed
127
147
  rescue StandardError => e
128
- Karafka.monitor.instrument(
148
+ monitor.instrument(
129
149
  'error.occurred',
130
150
  error: e,
131
151
  caller: self,
132
- seek_offset: coordinator.seek_offset,
152
+ seek_offset: seek_offset,
133
153
  type: 'consumer.eofed.error'
134
154
  )
135
155
  end
@@ -161,7 +181,7 @@ module Karafka
161
181
  def on_revoked
162
182
  handle_revoked
163
183
  rescue StandardError => e
164
- Karafka.monitor.instrument(
184
+ monitor.instrument(
165
185
  'error.occurred',
166
186
  error: e,
167
187
  caller: self,
@@ -182,7 +202,7 @@ module Karafka
182
202
  def on_shutdown
183
203
  handle_shutdown
184
204
  rescue StandardError => e
185
- Karafka.monitor.instrument(
205
+ monitor.instrument(
186
206
  'error.occurred',
187
207
  error: e,
188
208
  caller: self,
@@ -209,6 +229,40 @@ module Karafka
209
229
  raise NotImplementedError, 'Implement this in a subclass'
210
230
  end
211
231
 
232
+ # This method can be redefined to build a wrapping API around user code + karafka flow control
233
+ # code starting from the user code (operations prior to that are not part of this).
234
+ # The wrapping relates to a single job flow.
235
+ #
236
+ # Karafka framework may require user configured "state" like for example a selected
237
+ # transactional producer that should be used not only by the user but also by the framework.
238
+ # By using this API user can checkout a producer and return it to the pool.
239
+ #
240
+ # @param _action [Symbol] what action are we wrapping. Useful if we want for example to only
241
+ # wrap the `:consume` action.
242
+ # @yield Runs the execution block
243
+ #
244
+ # @note User related errors should not leak to this level of execution. This should not be used
245
+ # for anything consumption related but only for setting up state that that Karafka code
246
+ # may need outside of user code.
247
+ #
248
+ # @example Redefine to use a producer from a pool for consume
249
+ # def wrap(action)
250
+ # # Do not checkout producer for any other actions
251
+ # return yield unless action == :consume
252
+ #
253
+ # default_producer = self.producer
254
+ #
255
+ # $producers.with do |producer|
256
+ # self.producer = producer
257
+ # yield
258
+ # end
259
+ #
260
+ # self.producer = default_producer
261
+ # end
262
+ def wrap(_action)
263
+ yield
264
+ end
265
+
212
266
  # Method that will be executed when a given topic partition reaches eof without any new
213
267
  # incoming messages alongside
214
268
  def eofed; end
@@ -255,7 +309,7 @@ module Karafka
255
309
  # Indicate, that user took a manual action of pausing
256
310
  coordinator.manual_pause if manual_pause
257
311
 
258
- Karafka.monitor.instrument(
312
+ monitor.instrument(
259
313
  'consumer.consuming.pause',
260
314
  caller: self,
261
315
  manual: manual_pause,
@@ -291,7 +345,7 @@ module Karafka
291
345
  # @note Please note, that if you are seeking to a time offset, getting the offset is blocking
292
346
  def seek(offset, manual_seek = true, reset_offset: false)
293
347
  coordinator.manual_seek if manual_seek
294
- coordinator.seek_offset = nil if reset_offset
348
+ self.seek_offset = nil if reset_offset
295
349
 
296
350
  message = Karafka::Messages::Seek.new(
297
351
  topic.name,
@@ -299,7 +353,7 @@ module Karafka
299
353
  offset
300
354
  )
301
355
 
302
- Karafka.monitor.instrument(
356
+ monitor.instrument(
303
357
  'consumer.consuming.seek',
304
358
  caller: self,
305
359
  topic: topic.name,
@@ -343,16 +397,16 @@ module Karafka
343
397
  # Pauses the processing from the last offset to retry on given message
344
398
  # @private
345
399
  def retry_after_pause
346
- pause(coordinator.seek_offset, nil, false)
400
+ pause(seek_offset, nil, false)
347
401
 
348
402
  # Instrumentation needs to run **after** `#pause` invocation because we rely on the states
349
403
  # set by `#pause`
350
- Karafka.monitor.instrument(
404
+ monitor.instrument(
351
405
  'consumer.consuming.retry',
352
406
  caller: self,
353
407
  topic: topic.name,
354
408
  partition: partition,
355
- offset: coordinator.seek_offset,
409
+ offset: seek_offset,
356
410
  timeout: coordinator.pause_tracker.current_timeout,
357
411
  attempt: attempt
358
412
  )
@@ -66,7 +66,7 @@ module Karafka
66
66
  @subscription_group = subscription_group
67
67
  @buffer = RawMessagesBuffer.new
68
68
  @tick_interval = ::Karafka::App.config.internal.tick_interval
69
- @rebalance_manager = RebalanceManager.new(@subscription_group.id)
69
+ @rebalance_manager = RebalanceManager.new(@subscription_group.id, @buffer)
70
70
  @rebalance_callback = Instrumentation::Callbacks::Rebalance.new(@subscription_group)
71
71
 
72
72
  @interval_runner = Helpers::IntervalRunner.new do
@@ -141,7 +141,7 @@ module Karafka
141
141
  # Since rebalances do not occur often, we can run events polling as well without
142
142
  # any throttling
143
143
  events_poll
144
- remove_revoked_and_duplicated_messages
144
+
145
145
  break
146
146
  end
147
147
 
@@ -717,20 +717,6 @@ module Karafka
717
717
  consumer
718
718
  end
719
719
 
720
- # We may have a case where in the middle of data polling, we've lost a partition.
721
- # In a case like this we should remove all the pre-buffered messages from list partitions as
722
- # we are no longer responsible in a given process for processing those messages and they
723
- # should have been picked up by a different process.
724
- def remove_revoked_and_duplicated_messages
725
- @rebalance_manager.lost_partitions.each do |topic, partitions|
726
- partitions.each do |partition|
727
- @buffer.delete(topic, partition)
728
- end
729
- end
730
-
731
- @buffer.uniq!
732
- end
733
-
734
720
  # @return [Rdkafka::Consumer] librdkafka consumer instance
735
721
  def kafka
736
722
  return @kafka if @kafka
@@ -2,7 +2,9 @@
2
2
 
3
3
  module Karafka
4
4
  module Connection
5
- # Manager for tracking changes in the partitions assignment after the assignment is done.
5
+ # Manager for tracking changes in the partitions assignment after the assignment is done and
6
+ # for ensuring, that proper buffer related operations that may be impacted by the rebalance
7
+ # state are applied.
6
8
  #
7
9
  # We need tracking of those to clean up consumers that will no longer process given partitions
8
10
  # as they were taken away.
@@ -30,13 +32,15 @@ module Karafka
30
32
  private_constant :EMPTY_ARRAY
31
33
 
32
34
  # @param subscription_group_id [String] subscription group id
35
+ # @param buffer [Karafka::Connection::RawMessagesBuffer]
33
36
  # @return [RebalanceManager]
34
- def initialize(subscription_group_id)
37
+ def initialize(subscription_group_id, buffer)
35
38
  @assigned_partitions = {}
36
39
  @revoked_partitions = {}
37
40
  @changed = false
38
41
  @active = false
39
42
  @subscription_group_id = subscription_group_id
43
+ @buffer = buffer
40
44
 
41
45
  # Connects itself to the instrumentation pipeline so rebalances can be tracked
42
46
  ::Karafka.monitor.subscribe(self)
@@ -64,17 +68,6 @@ module Karafka
64
68
  @active
65
69
  end
66
70
 
67
- # We consider as lost only partitions that were taken away and not re-assigned back to us
68
- def lost_partitions
69
- lost_partitions = {}
70
-
71
- revoked_partitions.each do |topic, partitions|
72
- lost_partitions[topic] = partitions - assigned_partitions.fetch(topic, EMPTY_ARRAY)
73
- end
74
-
75
- lost_partitions
76
- end
77
-
78
71
  # Callback that kicks in inside of rdkafka, when new partitions were assigned.
79
72
  #
80
73
  # @private
@@ -99,6 +92,24 @@ module Karafka
99
92
  @active = true
100
93
  @revoked_partitions = event[:tpl].to_h.transform_values { |part| part.map(&:partition) }
101
94
  @changed = true
95
+
96
+ remove_revoked_and_duplicated_messages
97
+ end
98
+
99
+ private
100
+
101
+ # We may have a case where in the middle of data polling, we've lost a partition.
102
+ # In a case like this we should remove all the pre-buffered messages from list partitions as
103
+ # we are no longer responsible in a given process for processing those messages and they
104
+ # should have been picked up by a different process.
105
+ def remove_revoked_and_duplicated_messages
106
+ @revoked_partitions.each do |topic, partitions|
107
+ partitions.each do |partition|
108
+ @buffer.delete(topic, partition)
109
+ end
110
+ end
111
+
112
+ @buffer.uniq!
102
113
  end
103
114
  end
104
115
  end
@@ -293,6 +293,9 @@ module Karafka
293
293
  when 'consumer.initialized.error'
294
294
  error "Consumer initialized error: #{error}"
295
295
  error details
296
+ when 'consumer.wrap.error'
297
+ error "Consumer wrap failed due to an error: #{error}"
298
+ error details
296
299
  when 'consumer.consume.error'
297
300
  error "Consumer consuming error: #{error}"
298
301
  error details
@@ -57,6 +57,7 @@ module Karafka
57
57
  consumer.consuming.pause
58
58
  consumer.consuming.retry
59
59
  consumer.consuming.seek
60
+ consumer.consuming.transaction
60
61
 
61
62
  consumer.before_schedule_idle
62
63
  consumer.idle
@@ -77,6 +78,9 @@ module Karafka
77
78
  consumer.shutting_down
78
79
  consumer.shutdown
79
80
 
81
+ consumer.wrap
82
+ consumer.wrapped
83
+
80
84
  dead_letter_queue.dispatched
81
85
 
82
86
  filtering.throttled
@@ -56,32 +56,7 @@ module Karafka
56
56
  consumer = job.executor.topic.consumer
57
57
  topic = job.executor.topic.name
58
58
 
59
- action = case job_type
60
- when 'Periodic'
61
- 'tick'
62
- when 'PeriodicNonBlocking'
63
- 'tick'
64
- when 'Shutdown'
65
- 'shutdown'
66
- when 'Revoked'
67
- 'revoked'
68
- when 'RevokedNonBlocking'
69
- 'revoked'
70
- when 'Idle'
71
- 'idle'
72
- when 'Eofed'
73
- 'eofed'
74
- when 'EofedNonBlocking'
75
- 'eofed'
76
- when 'ConsumeNonBlocking'
77
- 'consume'
78
- when 'Consume'
79
- 'consume'
80
- else
81
- raise Errors::UnsupportedCaseError, job_type
82
- end
83
-
84
- current_span.resource = "#{consumer}##{action}"
59
+ current_span.resource = "#{consumer}##{job.class.action}"
85
60
  info "[#{job.id}] #{job_type} job for #{consumer} on #{topic} started"
86
61
 
87
62
  pop_tags
@@ -1,15 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This Karafka component is a Pro component under a commercial license.
4
- # This Karafka component is NOT licensed under LGPL.
5
- #
6
- # All of the commercial components are present in the lib/karafka/pro directory of this
7
- # repository and their usage requires commercial license agreement.
8
- #
9
- # Karafka has also commercial-friendly license, commercial support and commercial components.
10
- #
11
- # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
- # your code to Maciej Mensfeld.
3
+ # This code is part of Karafka Pro, a commercial component not licensed under LGPL.
4
+ # See LICENSE for details.
13
5
 
14
6
  module Karafka
15
7
  module Pro
@@ -1,15 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This Karafka component is a Pro component under a commercial license.
4
- # This Karafka component is NOT licensed under LGPL.
5
- #
6
- # All of the commercial components are present in the lib/karafka/pro directory of this
7
- # repository and their usage requires commercial license agreement.
8
- #
9
- # Karafka has also commercial-friendly license, commercial support and commercial components.
10
- #
11
- # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
- # your code to Maciej Mensfeld.
3
+ # This code is part of Karafka Pro, a commercial component not licensed under LGPL.
4
+ # See LICENSE for details.
13
5
 
14
6
  module Karafka
15
7
  module Pro
@@ -1,15 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This Karafka component is a Pro component under a commercial license.
4
- # This Karafka component is NOT licensed under LGPL.
5
- #
6
- # All of the commercial components are present in the lib/karafka/pro directory of this
7
- # repository and their usage requires commercial license agreement.
8
- #
9
- # Karafka has also commercial-friendly license, commercial support and commercial components.
10
- #
11
- # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
- # your code to Maciej Mensfeld.
3
+ # This code is part of Karafka Pro, a commercial component not licensed under LGPL.
4
+ # See LICENSE for details.
13
5
 
14
6
  module Karafka
15
7
  module Pro
@@ -1,15 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This Karafka component is a Pro component under a commercial license.
4
- # This Karafka component is NOT licensed under LGPL.
5
- #
6
- # All of the commercial components are present in the lib/karafka/pro directory of this
7
- # repository and their usage requires commercial license agreement.
8
- #
9
- # Karafka has also commercial-friendly license, commercial support and commercial components.
10
- #
11
- # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
- # your code to Maciej Mensfeld.
3
+ # This code is part of Karafka Pro, a commercial component not licensed under LGPL.
4
+ # See LICENSE for details.
13
5
 
14
6
  module Karafka
15
7
  module Pro
@@ -1,15 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This Karafka component is a Pro component under a commercial license.
4
- # This Karafka component is NOT licensed under LGPL.
5
- #
6
- # All of the commercial components are present in the lib/karafka/pro directory of this
7
- # repository and their usage requires commercial license agreement.
8
- #
9
- # Karafka has also commercial-friendly license, commercial support and commercial components.
10
- #
11
- # By sending a pull request to the pro components, you are agreeing to transfer the copyright of
12
- # your code to Maciej Mensfeld.
3
+ # This code is part of Karafka Pro, a commercial component not licensed under LGPL.
4
+ # See LICENSE for details.
13
5
 
14
6
  module Karafka
15
7
  module Pro