karafka 2.5.9 → 2.6.0.beta1

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 (471) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/certs/expired.txt +83 -0
  4. data/config/locales/errors.yml +17 -7
  5. data/karafka.gemspec +3 -3
  6. data/lib/active_job/queue_adapters/karafka_adapter.rb +1 -2
  7. data/lib/karafka/active_job/job_extensions.rb +1 -2
  8. data/lib/karafka/admin/configs/resource.rb +1 -2
  9. data/lib/karafka/admin/consumer_groups.rb +109 -98
  10. data/lib/karafka/admin/isolation_levels.rb +22 -0
  11. data/lib/karafka/admin/topics.rb +103 -8
  12. data/lib/karafka/admin.rb +59 -31
  13. data/lib/karafka/app.rb +16 -5
  14. data/lib/karafka/base_consumer.rb +2 -2
  15. data/lib/karafka/cli/contracts/server.rb +4 -4
  16. data/lib/karafka/cli/info.rb +1 -1
  17. data/lib/karafka/cli/topics/base.rb +10 -18
  18. data/lib/karafka/cli/topics/repartition.rb +1 -1
  19. data/lib/karafka/connection/client.rb +40 -9
  20. data/lib/karafka/connection/consumer_groups/rebalance_manager.rb +120 -0
  21. data/lib/karafka/connection/listener.rb +8 -7
  22. data/lib/karafka/connection/listeners_batch.rb +1 -1
  23. data/lib/karafka/connection/mode.rb +1 -2
  24. data/lib/karafka/connection/raw_messages_buffer.rb +0 -5
  25. data/lib/karafka/declaratives/builder.rb +65 -0
  26. data/lib/karafka/declaratives/contracts/topic.rb +28 -0
  27. data/lib/karafka/declaratives/repository.rb +52 -0
  28. data/lib/karafka/declaratives/topic.rb +100 -0
  29. data/lib/karafka/declaratives.rb +9 -0
  30. data/lib/karafka/helpers/interval_runner.rb +2 -2
  31. data/lib/karafka/instrumentation/assignments_tracker.rb +65 -2
  32. data/lib/karafka/instrumentation/callbacks/consumer_groups/error.rb +56 -0
  33. data/lib/karafka/instrumentation/callbacks/consumer_groups/rebalance.rb +93 -0
  34. data/lib/karafka/instrumentation/callbacks/consumer_groups/statistics.rb +59 -0
  35. data/lib/karafka/instrumentation/logger_listener.rb +27 -9
  36. data/lib/karafka/instrumentation/notifications.rb +2 -0
  37. data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +14 -17
  38. data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +8 -9
  39. data/lib/karafka/instrumentation/vendors/kubernetes/base_listener.rb +7 -3
  40. data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +13 -10
  41. data/lib/karafka/licenser.rb +16 -3
  42. data/lib/karafka/pro/active_job/consumer.rb +1 -2
  43. data/lib/karafka/pro/active_job/dispatcher.rb +1 -2
  44. data/lib/karafka/pro/admin/recovery.rb +19 -19
  45. data/lib/karafka/pro/base_consumer.rb +3 -3
  46. data/lib/karafka/pro/cli/contracts/server.rb +5 -5
  47. data/lib/karafka/pro/cli/parallel_segments/base.rb +7 -7
  48. data/lib/karafka/pro/cli/parallel_segments/collapse.rb +4 -4
  49. data/lib/karafka/pro/cli/parallel_segments/distribute.rb +6 -6
  50. data/lib/karafka/pro/iterator/tpl_builder.rb +38 -18
  51. data/lib/karafka/pro/loader.rb +15 -12
  52. data/lib/karafka/pro/processing/consumer_groups/adaptive_iterator/consumer.rb +84 -0
  53. data/lib/karafka/pro/processing/consumer_groups/adaptive_iterator/tracker.rb +97 -0
  54. data/lib/karafka/pro/processing/consumer_groups/collapser.rb +84 -0
  55. data/lib/karafka/pro/processing/consumer_groups/coordinator.rb +202 -0
  56. data/lib/karafka/pro/processing/consumer_groups/coordinators/errors_tracker.rb +124 -0
  57. data/lib/karafka/pro/processing/consumer_groups/coordinators/filters_applier.rb +157 -0
  58. data/lib/karafka/pro/processing/consumer_groups/coordinators/virtual_offset_manager.rb +212 -0
  59. data/lib/karafka/pro/processing/{filters/expirer.rb → consumer_groups/executor.rb} +17 -31
  60. data/lib/karafka/pro/processing/{jobs/periodic.rb → consumer_groups/expansions_selector.rb} +18 -21
  61. data/lib/karafka/pro/processing/consumer_groups/filters/base.rb +103 -0
  62. data/lib/karafka/pro/processing/consumer_groups/filters/delayer.rb +92 -0
  63. data/lib/karafka/pro/processing/consumer_groups/filters/expirer.rb +78 -0
  64. data/lib/karafka/pro/processing/consumer_groups/filters/inline_insights_delayer.rb +99 -0
  65. data/lib/karafka/pro/processing/consumer_groups/filters/throttler.rb +106 -0
  66. data/lib/karafka/pro/processing/consumer_groups/filters/virtual_limiter.rb +79 -0
  67. data/lib/karafka/pro/processing/{jobs → consumer_groups/jobs}/consume_non_blocking.rb +21 -17
  68. data/lib/karafka/pro/processing/{virtual_partitions/distributors/consistent.rb → consumer_groups/jobs/eofed_non_blocking.rb} +16 -14
  69. data/lib/karafka/pro/processing/consumer_groups/jobs/periodic.rb +64 -0
  70. data/lib/karafka/pro/processing/{jobs → consumer_groups/jobs}/periodic_non_blocking.rb +16 -11
  71. data/lib/karafka/pro/processing/{jobs → consumer_groups/jobs}/revoked_non_blocking.rb +19 -15
  72. data/lib/karafka/pro/processing/consumer_groups/jobs_builder.rb +95 -0
  73. data/lib/karafka/pro/processing/consumer_groups/offset_metadata/consumer.rb +66 -0
  74. data/lib/karafka/pro/processing/consumer_groups/offset_metadata/fetcher.rb +154 -0
  75. data/lib/karafka/pro/processing/consumer_groups/offset_metadata/listener.rb +68 -0
  76. data/lib/karafka/pro/processing/consumer_groups/parallel_segments/filters/base.rb +102 -0
  77. data/lib/karafka/pro/processing/consumer_groups/parallel_segments/filters/default.rb +115 -0
  78. data/lib/karafka/pro/processing/consumer_groups/parallel_segments/filters/mom.rb +96 -0
  79. data/lib/karafka/pro/processing/consumer_groups/partitioner.rb +98 -0
  80. data/lib/karafka/pro/processing/consumer_groups/periodic_job/consumer.rb +90 -0
  81. data/lib/karafka/pro/processing/consumer_groups/piping/consumer.rb +154 -0
  82. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_lrj_mom.rb +93 -0
  83. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_lrj_mom_vp.rb +99 -0
  84. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_mom.rb +92 -0
  85. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_mom_vp.rb +90 -0
  86. data/lib/karafka/pro/processing/{strategies/aj/dlq_ftr_lrj_mom.rb → consumer_groups/strategies/aj/dlq_lrj_mom.rb} +37 -39
  87. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_lrj_mom_vp.rb +90 -0
  88. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_mom.rb +84 -0
  89. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_mom_vp.rb +89 -0
  90. data/lib/karafka/pro/processing/{strategies → consumer_groups/strategies}/aj/ftr_lrj_mom.rb +20 -15
  91. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/ftr_lrj_mom_vp.rb +91 -0
  92. data/lib/karafka/pro/processing/{strategies → consumer_groups/strategies}/aj/ftr_mom.rb +20 -15
  93. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/ftr_mom_vp.rb +80 -0
  94. data/lib/karafka/pro/processing/{strategies/mom/default.rb → consumer_groups/strategies/aj/lrj_mom.rb} +18 -22
  95. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/lrj_mom_vp.rb +106 -0
  96. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/mom.rb +58 -0
  97. data/lib/karafka/pro/processing/consumer_groups/strategies/aj/mom_vp.rb +74 -0
  98. data/lib/karafka/pro/processing/{strategies/lrj/vp.rb → consumer_groups/strategies/base.rb} +9 -14
  99. data/lib/karafka/pro/processing/consumer_groups/strategies/default.rb +421 -0
  100. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/default.rb +285 -0
  101. data/lib/karafka/pro/processing/{strategies/dlq/lrj.rb → consumer_groups/strategies/dlq/ftr.rb} +30 -29
  102. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_lrj.rb +95 -0
  103. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_lrj_mom.rb +97 -0
  104. data/lib/karafka/pro/processing/{executor.rb → consumer_groups/strategies/dlq/ftr_lrj_mom_vp.rb} +26 -15
  105. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_lrj_vp.rb +63 -0
  106. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_mom.rb +97 -0
  107. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_mom_vp.rb +63 -0
  108. data/lib/karafka/pro/{routing/features/patterns/patterns.rb → processing/consumer_groups/strategies/dlq/ftr_vp.rb} +22 -12
  109. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/lrj.rb +83 -0
  110. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/lrj_mom.rb +100 -0
  111. data/lib/karafka/pro/processing/{strategies → consumer_groups/strategies}/dlq/lrj_mom_vp.rb +18 -13
  112. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/lrj_vp.rb +61 -0
  113. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/mom.rb +96 -0
  114. data/lib/karafka/pro/processing/{strategies/lrj → consumer_groups/strategies/dlq}/mom_vp.rb +19 -15
  115. data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/vp.rb +62 -0
  116. data/lib/karafka/pro/processing/consumer_groups/strategies/ftr/default.rb +146 -0
  117. data/lib/karafka/pro/processing/{strategies/mom/ftr.rb → consumer_groups/strategies/ftr/vp.rb} +20 -28
  118. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/default.rb +119 -0
  119. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr.rb +94 -0
  120. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr_mom.rb +92 -0
  121. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr_mom_vp.rb +62 -0
  122. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr_vp.rb +61 -0
  123. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/mom.rb +101 -0
  124. data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/mom_vp.rb +60 -0
  125. data/lib/karafka/pro/processing/{strategies/mom → consumer_groups/strategies/lrj}/vp.rb +18 -12
  126. data/lib/karafka/pro/processing/{strategies/aj/mom_vp.rb → consumer_groups/strategies/mom/default.rb} +22 -23
  127. data/lib/karafka/pro/processing/{strategies/aj/ftr_mom_vp.rb → consumer_groups/strategies/mom/ftr.rb} +28 -28
  128. data/lib/karafka/pro/processing/{virtual_partitions/distributors/base.rb → consumer_groups/strategies/mom/ftr_vp.rb} +19 -14
  129. data/lib/karafka/pro/processing/{strategies/aj/mom.rb → consumer_groups/strategies/mom/vp.rb} +16 -12
  130. data/lib/karafka/pro/processing/consumer_groups/strategies/vp/default.rb +197 -0
  131. data/lib/karafka/pro/processing/consumer_groups/strategy_selector.rb +106 -0
  132. data/lib/karafka/pro/processing/consumer_groups/subscription_groups_coordinator.rb +73 -0
  133. data/lib/karafka/pro/processing/consumer_groups/virtual_partitions/distributors/balanced.rb +82 -0
  134. data/lib/karafka/pro/processing/consumer_groups/virtual_partitions/distributors/base.rb +59 -0
  135. data/lib/karafka/pro/processing/{strategies/dlq/ftr.rb → consumer_groups/virtual_partitions/distributors/consistent.rb} +18 -33
  136. data/lib/karafka/pro/processing/filters/base.rb +3 -61
  137. data/lib/karafka/pro/processing/partitioner.rb +2 -57
  138. data/lib/karafka/pro/processing/schedulers/base.rb +10 -6
  139. data/lib/karafka/pro/processing/schedulers/default.rb +6 -5
  140. data/lib/karafka/pro/recurring_tasks/executor.rb +1 -2
  141. data/lib/karafka/pro/routing/features/{active_job → consumer_groups/active_job}/builder.rb +20 -18
  142. data/lib/karafka/pro/routing/features/{inline_insights/config.rb → consumer_groups/active_job.rb} +5 -9
  143. data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator/config.rb +53 -0
  144. data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator/contracts/topic.rb +91 -0
  145. data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator/topic.rb +90 -0
  146. data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator.rb +50 -0
  147. data/lib/karafka/pro/routing/features/{patterns/contracts/consumer_group.rb → consumer_groups/dead_letter_queue/contracts/topic.rb} +25 -30
  148. data/lib/karafka/pro/routing/features/consumer_groups/dead_letter_queue/topic.rb +70 -0
  149. data/lib/karafka/pro/routing/features/consumer_groups/dead_letter_queue.rb +46 -0
  150. data/lib/karafka/pro/routing/features/{direct_assignments → consumer_groups/delaying}/config.rb +6 -4
  151. data/lib/karafka/pro/routing/features/{patterns/contracts/pattern.rb → consumer_groups/delaying/contracts/topic.rb} +13 -16
  152. data/lib/karafka/pro/routing/features/consumer_groups/delaying/topic.rb +85 -0
  153. data/lib/karafka/pro/routing/features/{adaptive_iterator/config.rb → consumer_groups/delaying.rb} +8 -11
  154. data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/config.rb +46 -0
  155. data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/contracts/consumer_group.rb +68 -0
  156. data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/contracts/topic.rb +125 -0
  157. data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/subscription_group.rb +97 -0
  158. data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/topic.rb +97 -0
  159. data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments.rb +44 -0
  160. data/lib/karafka/pro/routing/features/consumer_groups/inline_insights/config.rb +51 -0
  161. data/lib/karafka/pro/routing/features/consumer_groups/inline_insights/contracts/topic.rb +58 -0
  162. data/lib/karafka/pro/routing/features/consumer_groups/inline_insights/topic.rb +80 -0
  163. data/lib/karafka/pro/routing/features/consumer_groups/inline_insights.rb +45 -0
  164. data/lib/karafka/pro/routing/features/consumer_groups/long_running_job/config.rb +47 -0
  165. data/lib/karafka/pro/routing/features/{multiplexing/patches/contracts/consumer_group.rb → consumer_groups/long_running_job/contracts/topic.rb} +13 -15
  166. data/lib/karafka/pro/routing/features/consumer_groups/long_running_job/topic.rb +72 -0
  167. data/lib/karafka/pro/routing/features/{long_running_job.rb → consumer_groups/long_running_job.rb} +6 -4
  168. data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/config.rb +58 -0
  169. data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/contracts/routing.rb +83 -0
  170. data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/contracts/topic.rb +148 -0
  171. data/lib/karafka/pro/routing/features/{delaying/contracts/topic.rb → consumer_groups/multiplexing/patches/contracts/consumer_group.rb} +19 -14
  172. data/lib/karafka/pro/routing/features/{multiplexing/subscription_group.rb → consumer_groups/multiplexing/proxy.rb} +17 -23
  173. data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/subscription_group.rb +68 -0
  174. data/lib/karafka/pro/routing/features/{multiplexing → consumer_groups/multiplexing}/subscription_groups_builder.rb +16 -14
  175. data/lib/karafka/pro/routing/features/consumer_groups/multiplexing.rb +85 -0
  176. data/lib/karafka/pro/routing/features/consumer_groups/non_blocking_job/topic.rb +51 -0
  177. data/lib/karafka/pro/routing/features/{non_blocking_job.rb → consumer_groups/non_blocking_job.rb} +15 -13
  178. data/lib/karafka/pro/routing/features/consumer_groups/offset_metadata/config.rb +52 -0
  179. data/lib/karafka/pro/routing/features/consumer_groups/offset_metadata/contracts/topic.rb +59 -0
  180. data/lib/karafka/pro/routing/features/consumer_groups/offset_metadata/topic.rb +93 -0
  181. data/lib/karafka/pro/routing/features/{offset_metadata.rb → consumer_groups/offset_metadata.rb} +16 -14
  182. data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments/builder.rb +74 -0
  183. data/lib/karafka/pro/routing/features/{multiplexing → consumer_groups/parallel_segments}/config.rb +13 -15
  184. data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments/consumer_group.rb +110 -0
  185. data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments/contracts/consumer_group.rb +74 -0
  186. data/lib/karafka/pro/routing/features/{parallel_segments → consumer_groups/parallel_segments}/topic.rb +24 -22
  187. data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments.rb +51 -0
  188. data/lib/karafka/pro/routing/features/{patterns → consumer_groups/patterns}/builder.rb +15 -13
  189. data/lib/karafka/pro/routing/features/{offset_metadata/contracts/topic.rb → consumer_groups/patterns/config.rb} +28 -13
  190. data/lib/karafka/pro/routing/features/consumer_groups/patterns/consumer_group.rb +91 -0
  191. data/lib/karafka/pro/routing/features/consumer_groups/patterns/contracts/consumer_group.rb +83 -0
  192. data/lib/karafka/pro/routing/features/{parallel_segments.rb → consumer_groups/patterns/contracts/pattern.rb} +24 -10
  193. data/lib/karafka/pro/routing/features/consumer_groups/patterns/contracts/topic.rb +58 -0
  194. data/lib/karafka/pro/routing/features/consumer_groups/patterns/detector.rb +98 -0
  195. data/lib/karafka/pro/routing/features/consumer_groups/patterns/pattern.rb +114 -0
  196. data/lib/karafka/pro/routing/features/{recurring_tasks/contracts/topic.rb → consumer_groups/patterns/patterns.rb} +12 -13
  197. data/lib/karafka/pro/routing/features/consumer_groups/patterns/topic.rb +78 -0
  198. data/lib/karafka/pro/routing/features/consumer_groups/patterns/topics.rb +72 -0
  199. data/lib/karafka/pro/routing/features/consumer_groups/patterns.rb +52 -0
  200. data/lib/karafka/pro/routing/features/consumer_groups/periodic_job/config.rb +56 -0
  201. data/lib/karafka/pro/routing/features/{direct_assignments/contracts/consumer_group.rb → consumer_groups/periodic_job/contracts/topic.rb} +17 -22
  202. data/lib/karafka/pro/routing/features/consumer_groups/periodic_job/topic.rb +122 -0
  203. data/lib/karafka/pro/routing/features/consumer_groups/periodic_job.rb +46 -0
  204. data/lib/karafka/pro/routing/features/consumer_groups/recurring_tasks/builder.rb +150 -0
  205. data/lib/karafka/pro/routing/features/{swarm → consumer_groups/recurring_tasks}/config.rb +7 -8
  206. data/lib/karafka/pro/routing/features/{inline_insights → consumer_groups/recurring_tasks}/contracts/topic.rb +14 -13
  207. data/lib/karafka/pro/routing/features/{scheduled_messages → consumer_groups/recurring_tasks}/proxy.rb +6 -4
  208. data/lib/karafka/pro/routing/features/consumer_groups/recurring_tasks/topic.rb +72 -0
  209. data/lib/karafka/pro/routing/features/consumer_groups/recurring_tasks.rb +44 -0
  210. data/lib/karafka/pro/routing/features/consumer_groups/scheduled_messages/builder.rb +154 -0
  211. data/lib/karafka/pro/routing/features/consumer_groups/scheduled_messages/config.rb +47 -0
  212. data/lib/karafka/pro/routing/features/{long_running_job → consumer_groups/scheduled_messages}/contracts/topic.rb +14 -12
  213. data/lib/karafka/pro/routing/features/{delaying/config.rb → consumer_groups/scheduled_messages/proxy.rb} +6 -4
  214. data/lib/karafka/pro/routing/features/consumer_groups/scheduled_messages/topic.rb +72 -0
  215. data/lib/karafka/pro/routing/features/{recurring_tasks/proxy.rb → consumer_groups/scheduled_messages.rb} +3 -4
  216. data/lib/karafka/pro/routing/features/{non_blocking_job/topic.rb → consumer_groups/swarm/config.rb} +9 -8
  217. data/lib/karafka/pro/routing/features/consumer_groups/swarm/contracts/routing.rb +94 -0
  218. data/lib/karafka/pro/routing/features/consumer_groups/swarm/contracts/topic.rb +95 -0
  219. data/lib/karafka/pro/routing/features/consumer_groups/swarm/topic.rb +105 -0
  220. data/lib/karafka/pro/routing/features/consumer_groups/swarm.rb +58 -0
  221. data/lib/karafka/pro/routing/features/consumer_groups/virtual_partitions/config.rb +69 -0
  222. data/lib/karafka/pro/routing/features/{parallel_segments/contracts/consumer_group.rb → consumer_groups/virtual_partitions/contracts/topic.rb} +21 -18
  223. data/lib/karafka/pro/routing/features/consumer_groups/virtual_partitions/topic.rb +101 -0
  224. data/lib/karafka/pro/routing/features/consumer_groups/virtual_partitions.rb +46 -0
  225. data/lib/karafka/pro/routing/features/{scheduled_messages.rb → consumer_groups.rb} +3 -2
  226. data/lib/karafka/pro/routing/features/expiring/topic.rb +4 -4
  227. data/lib/karafka/pro/routing/features/filtering/topic.rb +3 -3
  228. data/lib/karafka/pro/routing/features/pausing/topic.rb +3 -3
  229. data/lib/karafka/pro/routing/features/throttling/topic.rb +4 -4
  230. data/lib/karafka/pro/setup/defaults_injector.rb +70 -0
  231. data/lib/karafka/pro/swarm/liveness_listener.rb +22 -10
  232. data/lib/karafka/processing/consumer_groups/coordinator.rb +221 -0
  233. data/lib/karafka/processing/consumer_groups/coordinators_buffer.rb +69 -0
  234. data/lib/karafka/processing/consumer_groups/executor.rb +220 -0
  235. data/lib/karafka/processing/consumer_groups/executors_buffer.rb +94 -0
  236. data/lib/karafka/processing/consumer_groups/expansions_selector.rb +26 -0
  237. data/lib/karafka/processing/consumer_groups/inline_insights/consumer.rb +47 -0
  238. data/lib/karafka/processing/consumer_groups/inline_insights/listener.rb +23 -0
  239. data/lib/karafka/processing/consumer_groups/inline_insights/tracker.rb +132 -0
  240. data/lib/karafka/processing/consumer_groups/jobs/consume.rb +52 -0
  241. data/lib/karafka/processing/consumer_groups/jobs/eofed.rb +34 -0
  242. data/lib/karafka/processing/consumer_groups/jobs/idle.rb +33 -0
  243. data/lib/karafka/processing/consumer_groups/jobs/revoked.rb +34 -0
  244. data/lib/karafka/processing/consumer_groups/jobs/shutdown.rb +32 -0
  245. data/lib/karafka/processing/consumer_groups/jobs_builder.rb +36 -0
  246. data/lib/karafka/processing/consumer_groups/partitioner.rb +28 -0
  247. data/lib/karafka/processing/consumer_groups/strategies/aj_dlq_mom.rb +48 -0
  248. data/lib/karafka/processing/consumer_groups/strategies/aj_mom.rb +25 -0
  249. data/lib/karafka/processing/consumer_groups/strategies/base.rb +65 -0
  250. data/lib/karafka/processing/consumer_groups/strategies/default.rb +218 -0
  251. data/lib/karafka/processing/consumer_groups/strategies/dlq.rb +157 -0
  252. data/lib/karafka/processing/consumer_groups/strategies/dlq_mom.rb +72 -0
  253. data/lib/karafka/processing/consumer_groups/strategies/mom.rb +33 -0
  254. data/lib/karafka/processing/consumer_groups/strategy_selector.rb +53 -0
  255. data/lib/karafka/processing/coordinator.rb +4 -211
  256. data/lib/karafka/processing/coordinators_buffer.rb +4 -59
  257. data/lib/karafka/processing/jobs_queue.rb +12 -4
  258. data/lib/karafka/processing/partitioner.rb +4 -18
  259. data/lib/karafka/processing/schedulers/default.rb +2 -1
  260. data/lib/karafka/processing/strategy_selector.rb +4 -42
  261. data/lib/karafka/processing/worker.rb +8 -4
  262. data/lib/karafka/processing/workers_pool.rb +158 -0
  263. data/lib/karafka/routing/builder.rb +12 -12
  264. data/lib/karafka/routing/contracts/routing.rb +3 -4
  265. data/lib/karafka/routing/features/base/expander.rb +5 -5
  266. data/lib/karafka/routing/features/consumer_groups/active_job/builder.rb +35 -0
  267. data/lib/karafka/routing/features/consumer_groups/active_job/config.rb +17 -0
  268. data/lib/karafka/routing/features/consumer_groups/active_job/contracts/topic.rb +44 -0
  269. data/lib/karafka/routing/features/consumer_groups/active_job/proxy.rb +16 -0
  270. data/lib/karafka/routing/features/consumer_groups/active_job/topic.rb +50 -0
  271. data/lib/karafka/routing/features/consumer_groups/active_job.rb +15 -0
  272. data/lib/karafka/routing/features/consumer_groups/dead_letter_queue/config.rb +39 -0
  273. data/lib/karafka/routing/features/consumer_groups/dead_letter_queue/contracts/topic.rb +58 -0
  274. data/lib/karafka/routing/features/consumer_groups/dead_letter_queue/topic.rb +76 -0
  275. data/lib/karafka/routing/features/consumer_groups/dead_letter_queue.rb +18 -0
  276. data/lib/karafka/routing/features/consumer_groups/eofed/config.rb +17 -0
  277. data/lib/karafka/routing/features/consumer_groups/eofed/contracts/topic.rb +39 -0
  278. data/lib/karafka/routing/features/consumer_groups/eofed/topic.rb +42 -0
  279. data/lib/karafka/routing/features/consumer_groups/eofed.rb +16 -0
  280. data/lib/karafka/routing/features/consumer_groups/inline_insights/config.rb +17 -0
  281. data/lib/karafka/routing/features/consumer_groups/inline_insights/contracts/topic.rb +27 -0
  282. data/lib/karafka/routing/features/consumer_groups/inline_insights/topic.rb +42 -0
  283. data/lib/karafka/routing/features/consumer_groups/inline_insights.rb +42 -0
  284. data/lib/karafka/routing/features/consumer_groups/manual_offset_management/config.rb +17 -0
  285. data/lib/karafka/routing/features/consumer_groups/manual_offset_management/contracts/topic.rb +27 -0
  286. data/lib/karafka/routing/features/consumer_groups/manual_offset_management/topic.rb +46 -0
  287. data/lib/karafka/routing/features/consumer_groups/manual_offset_management.rb +20 -0
  288. data/lib/karafka/routing/features/consumer_groups.rb +12 -0
  289. data/lib/karafka/routing/features/declaratives/contracts/topic.rb +4 -19
  290. data/lib/karafka/routing/features/declaratives/topic.rb +30 -14
  291. data/lib/karafka/routing/features/deserializers/topic.rb +3 -3
  292. data/lib/karafka/routing/router.rb +2 -2
  293. data/lib/karafka/routing/subscription_group.rb +18 -9
  294. data/lib/karafka/routing/topic.rb +25 -11
  295. data/lib/karafka/runner.rb +17 -17
  296. data/lib/karafka/server.rb +28 -6
  297. data/lib/karafka/setup/attributes_map.rb +2 -0
  298. data/lib/karafka/setup/config.rb +64 -15
  299. data/lib/karafka/setup/config_proxy.rb +1 -2
  300. data/lib/karafka/setup/contracts/config.rb +28 -8
  301. data/lib/karafka/setup/defaults_injector.rb +10 -0
  302. data/lib/karafka/status.rb +1 -2
  303. data/lib/karafka/swarm/liveness_listener.rb +7 -0
  304. data/lib/karafka/swarm/manager.rb +7 -7
  305. data/lib/karafka/swarm/node.rb +8 -0
  306. data/lib/karafka/swarm/supervisor.rb +9 -1
  307. data/lib/karafka/templates/karafka.rb.erb +11 -5
  308. data/lib/karafka/version.rb +1 -1
  309. metadata +237 -224
  310. data/lib/karafka/connection/rebalance_manager.rb +0 -116
  311. data/lib/karafka/instrumentation/callbacks/error.rb +0 -52
  312. data/lib/karafka/instrumentation/callbacks/rebalance.rb +0 -84
  313. data/lib/karafka/instrumentation/callbacks/statistics.rb +0 -55
  314. data/lib/karafka/pro/processing/adaptive_iterator/consumer.rb +0 -79
  315. data/lib/karafka/pro/processing/adaptive_iterator/tracker.rb +0 -92
  316. data/lib/karafka/pro/processing/collapser.rb +0 -79
  317. data/lib/karafka/pro/processing/coordinator.rb +0 -197
  318. data/lib/karafka/pro/processing/coordinators/errors_tracker.rb +0 -119
  319. data/lib/karafka/pro/processing/coordinators/filters_applier.rb +0 -152
  320. data/lib/karafka/pro/processing/coordinators/virtual_offset_manager.rb +0 -207
  321. data/lib/karafka/pro/processing/expansions_selector.rb +0 -52
  322. data/lib/karafka/pro/processing/filters/delayer.rb +0 -87
  323. data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +0 -95
  324. data/lib/karafka/pro/processing/filters/throttler.rb +0 -101
  325. data/lib/karafka/pro/processing/filters/virtual_limiter.rb +0 -74
  326. data/lib/karafka/pro/processing/jobs/eofed_non_blocking.rb +0 -51
  327. data/lib/karafka/pro/processing/jobs_builder.rb +0 -90
  328. data/lib/karafka/pro/processing/offset_metadata/consumer.rb +0 -61
  329. data/lib/karafka/pro/processing/offset_metadata/fetcher.rb +0 -149
  330. data/lib/karafka/pro/processing/offset_metadata/listener.rb +0 -63
  331. data/lib/karafka/pro/processing/parallel_segments/filters/base.rb +0 -98
  332. data/lib/karafka/pro/processing/parallel_segments/filters/default.rb +0 -110
  333. data/lib/karafka/pro/processing/parallel_segments/filters/mom.rb +0 -91
  334. data/lib/karafka/pro/processing/periodic_job/consumer.rb +0 -85
  335. data/lib/karafka/pro/processing/piping/consumer.rb +0 -149
  336. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +0 -94
  337. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom.rb +0 -87
  338. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom_vp.rb +0 -85
  339. data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom.rb +0 -81
  340. data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom_vp.rb +0 -85
  341. data/lib/karafka/pro/processing/strategies/aj/dlq_mom.rb +0 -79
  342. data/lib/karafka/pro/processing/strategies/aj/dlq_mom_vp.rb +0 -84
  343. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +0 -86
  344. data/lib/karafka/pro/processing/strategies/aj/lrj_mom.rb +0 -54
  345. data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +0 -101
  346. data/lib/karafka/pro/processing/strategies/base.rb +0 -43
  347. data/lib/karafka/pro/processing/strategies/default.rb +0 -416
  348. data/lib/karafka/pro/processing/strategies/dlq/default.rb +0 -280
  349. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +0 -90
  350. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +0 -92
  351. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom_vp.rb +0 -60
  352. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_vp.rb +0 -58
  353. data/lib/karafka/pro/processing/strategies/dlq/ftr_mom.rb +0 -92
  354. data/lib/karafka/pro/processing/strategies/dlq/ftr_mom_vp.rb +0 -58
  355. data/lib/karafka/pro/processing/strategies/dlq/ftr_vp.rb +0 -57
  356. data/lib/karafka/pro/processing/strategies/dlq/lrj_mom.rb +0 -95
  357. data/lib/karafka/pro/processing/strategies/dlq/lrj_vp.rb +0 -56
  358. data/lib/karafka/pro/processing/strategies/dlq/mom.rb +0 -91
  359. data/lib/karafka/pro/processing/strategies/dlq/mom_vp.rb +0 -54
  360. data/lib/karafka/pro/processing/strategies/dlq/vp.rb +0 -57
  361. data/lib/karafka/pro/processing/strategies/ftr/default.rb +0 -141
  362. data/lib/karafka/pro/processing/strategies/ftr/vp.rb +0 -57
  363. data/lib/karafka/pro/processing/strategies/lrj/default.rb +0 -114
  364. data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +0 -89
  365. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +0 -87
  366. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom_vp.rb +0 -57
  367. data/lib/karafka/pro/processing/strategies/lrj/ftr_vp.rb +0 -56
  368. data/lib/karafka/pro/processing/strategies/lrj/mom.rb +0 -96
  369. data/lib/karafka/pro/processing/strategies/mom/ftr_vp.rb +0 -54
  370. data/lib/karafka/pro/processing/strategies/vp/default.rb +0 -192
  371. data/lib/karafka/pro/processing/strategies.rb +0 -39
  372. data/lib/karafka/pro/processing/strategy_selector.rb +0 -102
  373. data/lib/karafka/pro/processing/subscription_groups_coordinator.rb +0 -68
  374. data/lib/karafka/pro/processing/virtual_partitions/distributors/balanced.rb +0 -77
  375. data/lib/karafka/pro/routing/features/active_job.rb +0 -43
  376. data/lib/karafka/pro/routing/features/adaptive_iterator/contracts/topic.rb +0 -89
  377. data/lib/karafka/pro/routing/features/adaptive_iterator/topic.rb +0 -88
  378. data/lib/karafka/pro/routing/features/adaptive_iterator.rb +0 -48
  379. data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +0 -74
  380. data/lib/karafka/pro/routing/features/dead_letter_queue/topic.rb +0 -68
  381. data/lib/karafka/pro/routing/features/dead_letter_queue.rb +0 -44
  382. data/lib/karafka/pro/routing/features/delaying/topic.rb +0 -83
  383. data/lib/karafka/pro/routing/features/delaying.rb +0 -46
  384. data/lib/karafka/pro/routing/features/direct_assignments/contracts/topic.rb +0 -123
  385. data/lib/karafka/pro/routing/features/direct_assignments/subscription_group.rb +0 -95
  386. data/lib/karafka/pro/routing/features/direct_assignments/topic.rb +0 -95
  387. data/lib/karafka/pro/routing/features/direct_assignments.rb +0 -42
  388. data/lib/karafka/pro/routing/features/inline_insights/topic.rb +0 -78
  389. data/lib/karafka/pro/routing/features/inline_insights.rb +0 -43
  390. data/lib/karafka/pro/routing/features/long_running_job/config.rb +0 -45
  391. data/lib/karafka/pro/routing/features/long_running_job/topic.rb +0 -70
  392. data/lib/karafka/pro/routing/features/multiplexing/contracts/routing.rb +0 -81
  393. data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +0 -146
  394. data/lib/karafka/pro/routing/features/multiplexing/proxy.rb +0 -58
  395. data/lib/karafka/pro/routing/features/multiplexing.rb +0 -83
  396. data/lib/karafka/pro/routing/features/offset_metadata/config.rb +0 -50
  397. data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +0 -91
  398. data/lib/karafka/pro/routing/features/parallel_segments/builder.rb +0 -72
  399. data/lib/karafka/pro/routing/features/parallel_segments/config.rb +0 -52
  400. data/lib/karafka/pro/routing/features/parallel_segments/consumer_group.rb +0 -108
  401. data/lib/karafka/pro/routing/features/patterns/config.rb +0 -71
  402. data/lib/karafka/pro/routing/features/patterns/consumer_group.rb +0 -89
  403. data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +0 -56
  404. data/lib/karafka/pro/routing/features/patterns/detector.rb +0 -96
  405. data/lib/karafka/pro/routing/features/patterns/pattern.rb +0 -112
  406. data/lib/karafka/pro/routing/features/patterns/topic.rb +0 -76
  407. data/lib/karafka/pro/routing/features/patterns/topics.rb +0 -70
  408. data/lib/karafka/pro/routing/features/patterns.rb +0 -50
  409. data/lib/karafka/pro/routing/features/periodic_job/config.rb +0 -54
  410. data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +0 -59
  411. data/lib/karafka/pro/routing/features/periodic_job/topic.rb +0 -120
  412. data/lib/karafka/pro/routing/features/periodic_job.rb +0 -44
  413. data/lib/karafka/pro/routing/features/recurring_tasks/builder.rb +0 -148
  414. data/lib/karafka/pro/routing/features/recurring_tasks/config.rb +0 -45
  415. data/lib/karafka/pro/routing/features/recurring_tasks/topic.rb +0 -70
  416. data/lib/karafka/pro/routing/features/recurring_tasks.rb +0 -42
  417. data/lib/karafka/pro/routing/features/scheduled_messages/builder.rb +0 -152
  418. data/lib/karafka/pro/routing/features/scheduled_messages/config.rb +0 -45
  419. data/lib/karafka/pro/routing/features/scheduled_messages/contracts/topic.rb +0 -55
  420. data/lib/karafka/pro/routing/features/scheduled_messages/topic.rb +0 -70
  421. data/lib/karafka/pro/routing/features/swarm/contracts/routing.rb +0 -92
  422. data/lib/karafka/pro/routing/features/swarm/contracts/topic.rb +0 -93
  423. data/lib/karafka/pro/routing/features/swarm/topic.rb +0 -103
  424. data/lib/karafka/pro/routing/features/swarm.rb +0 -56
  425. data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +0 -67
  426. data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +0 -73
  427. data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +0 -99
  428. data/lib/karafka/pro/routing/features/virtual_partitions.rb +0 -44
  429. data/lib/karafka/processing/executor.rb +0 -216
  430. data/lib/karafka/processing/executors_buffer.rb +0 -90
  431. data/lib/karafka/processing/expansions_selector.rb +0 -22
  432. data/lib/karafka/processing/inline_insights/consumer.rb +0 -43
  433. data/lib/karafka/processing/inline_insights/listener.rb +0 -19
  434. data/lib/karafka/processing/inline_insights/tracker.rb +0 -129
  435. data/lib/karafka/processing/jobs/consume.rb +0 -47
  436. data/lib/karafka/processing/jobs/eofed.rb +0 -29
  437. data/lib/karafka/processing/jobs/idle.rb +0 -31
  438. data/lib/karafka/processing/jobs/revoked.rb +0 -29
  439. data/lib/karafka/processing/jobs/shutdown.rb +0 -30
  440. data/lib/karafka/processing/jobs_builder.rb +0 -34
  441. data/lib/karafka/processing/strategies/aj_dlq_mom.rb +0 -44
  442. data/lib/karafka/processing/strategies/aj_mom.rb +0 -21
  443. data/lib/karafka/processing/strategies/base.rb +0 -61
  444. data/lib/karafka/processing/strategies/default.rb +0 -214
  445. data/lib/karafka/processing/strategies/dlq.rb +0 -153
  446. data/lib/karafka/processing/strategies/dlq_mom.rb +0 -68
  447. data/lib/karafka/processing/strategies/mom.rb +0 -29
  448. data/lib/karafka/processing/workers_batch.rb +0 -29
  449. data/lib/karafka/routing/features/active_job/builder.rb +0 -33
  450. data/lib/karafka/routing/features/active_job/config.rb +0 -15
  451. data/lib/karafka/routing/features/active_job/contracts/topic.rb +0 -42
  452. data/lib/karafka/routing/features/active_job/proxy.rb +0 -14
  453. data/lib/karafka/routing/features/active_job/topic.rb +0 -48
  454. data/lib/karafka/routing/features/active_job.rb +0 -13
  455. data/lib/karafka/routing/features/dead_letter_queue/config.rb +0 -37
  456. data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +0 -56
  457. data/lib/karafka/routing/features/dead_letter_queue/topic.rb +0 -74
  458. data/lib/karafka/routing/features/dead_letter_queue.rb +0 -16
  459. data/lib/karafka/routing/features/declaratives/config.rb +0 -18
  460. data/lib/karafka/routing/features/eofed/config.rb +0 -15
  461. data/lib/karafka/routing/features/eofed/contracts/topic.rb +0 -37
  462. data/lib/karafka/routing/features/eofed/topic.rb +0 -40
  463. data/lib/karafka/routing/features/eofed.rb +0 -14
  464. data/lib/karafka/routing/features/inline_insights/config.rb +0 -15
  465. data/lib/karafka/routing/features/inline_insights/contracts/topic.rb +0 -25
  466. data/lib/karafka/routing/features/inline_insights/topic.rb +0 -40
  467. data/lib/karafka/routing/features/inline_insights.rb +0 -40
  468. data/lib/karafka/routing/features/manual_offset_management/config.rb +0 -15
  469. data/lib/karafka/routing/features/manual_offset_management/contracts/topic.rb +0 -25
  470. data/lib/karafka/routing/features/manual_offset_management/topic.rb +0 -44
  471. data/lib/karafka/routing/features/manual_offset_management.rb +0 -18
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Karafka Pro - Source Available Commercial Software
4
- # Copyright (c) 2017-present Maciej Mensfeld. All rights reserved.
5
- #
6
- # This software is NOT open source. It is source-available commercial software
7
- # requiring a paid license for use. It is NOT covered by LGPL.
8
- #
9
- # The author retains all right, title, and interest in this software,
10
- # including all copyrights, patents, and other intellectual property rights.
11
- # No patent rights are granted under this license.
12
- #
13
- # PROHIBITED:
14
- # - Use without a valid commercial license
15
- # - Redistribution, modification, or derivative works without authorization
16
- # - Reverse engineering, decompilation, or disassembly of this software
17
- # - Use as training data for AI/ML models or inclusion in datasets
18
- # - Scraping, crawling, or automated collection for any purpose
19
- #
20
- # PERMITTED:
21
- # - Reading, referencing, and linking for personal or commercial use
22
- # - Runtime retrieval by AI assistants, coding agents, and RAG systems
23
- # for the purpose of providing contextual help to Karafka users
24
- #
25
- # Receipt, viewing, or possession of this software does not convey or
26
- # imply any license or right beyond those expressly stated above.
27
- #
28
- # License: https://karafka.io/docs/Pro-License-Comm/
29
- # Contact: contact@karafka.io
30
-
31
- module Karafka
32
- module Pro
33
- module Processing
34
- # Offset Metadata support on the processing side
35
- module OffsetMetadata
36
- # This fetcher is responsible for fetching and caching committed offsets metadata
37
- # information.
38
- #
39
- # By design we fetch all information for a requested topic assignments. Not all topics from
40
- # the same subscription group may need metadata and even if, we can run the few smaller
41
- # queries. This approach prevents us from querying all assigned topics data in one go
42
- # preventing excessive queries.
43
- #
44
- # Since the assumption is, that user will not have to reach out for the later metadata
45
- # since it is produced in the context of a given consumer assignment, we can cache the
46
- # initial result and only allow users for explicit invalidation.
47
- class Fetcher
48
- include Singleton
49
-
50
- class << self
51
- extend Forwardable
52
-
53
- def_delegators :instance, :register, :clear, :find
54
- end
55
-
56
- # Initializes the fetcher with empty caches
57
- def initialize
58
- @mutexes = {}
59
- @clients = {}
60
- @tpls = {}
61
- end
62
-
63
- # Registers a client of a given subscription group, so we can use it for queries later on
64
- # @param client [Karafka::Connection::Client]
65
- # @note Since we store the client reference and not the underlying rdkafka consumer
66
- # instance, we do not have to deal with the recovery as it is abstracted away
67
- def register(client)
68
- @clients[client.subscription_group] = client
69
- # We use one mutex per SG because independent SGs can query in parallel
70
- @mutexes[client.subscription_group] = Mutex.new
71
- @tpls[client.subscription_group] = {}
72
- end
73
-
74
- # Queries or retrieves from cache the given offset metadata for the selected partition
75
- #
76
- # @param topic [Karafka::Routing::Topic] routing topic with subscription group reference
77
- # @param partition [Integer] partition for which we want to get stored offset metadata
78
- # @param cache [Boolean] forces explicit query to Kafka when false and cache refresh.
79
- # By default we use the setting from the topic level but this can be overwritten on
80
- # a per request basis if needed.
81
- # @return [Object, false] deserialized metadata (string deserializer by default) or
82
- # false in case we were not able to obtain the details because we have lost the
83
- # assignment
84
- def find(topic, partition, cache: true)
85
- cache = topic.offset_metadata.cache? && cache
86
-
87
- tpls = fetch(topic, cache)
88
-
89
- return false unless tpls
90
-
91
- t_partitions = tpls.fetch(topic.name, [])
92
- t_partition = t_partitions.find { |t_p| t_p.partition == partition }
93
-
94
- # If we do not have given topic partition here, it means it is no longer part of our
95
- # assignment and we should return false
96
- return false unless t_partition
97
-
98
- topic.offset_metadata.deserializer.call(t_partition.metadata)
99
- end
100
-
101
- # Clears cache of a given subscription group. It is triggered on assignment changes.
102
- #
103
- # @param subscription_group [Karafka::Routing::SubscriptionGroup] subscription group that
104
- # we want to clear.
105
- def clear(subscription_group)
106
- @mutexes.fetch(subscription_group).synchronize do
107
- @tpls[subscription_group].clear
108
- end
109
- end
110
-
111
- private
112
-
113
- # Fetches from Kafka all committed offsets for the given topic partitions that are
114
- # assigned to this process.
115
- #
116
- # We fetch all because in majority of the cases, the behavior of the end user code is
117
- # not specific to a given partition both same for all. In such cases we save on
118
- # querying as we get all data for all partitions in one go.
119
- #
120
- # @param topic [Karafka::Routing::Topic] topic for which we want to fetch tpls data
121
- # @param cache [Boolean] should we return cached data if present
122
- def fetch(topic, cache)
123
- subscription_group = topic.subscription_group
124
- t_tpls = @tpls.fetch(subscription_group, false)
125
- t_tpl = t_tpls[topic]
126
-
127
- return t_tpl if t_tpl && cache
128
-
129
- assigned_tpls = @clients.fetch(subscription_group).assignment
130
- t_tpl = assigned_tpls.to_h.fetch(topic.name, false)
131
-
132
- # May be false in case we lost given assignment but still run LRJ
133
- return false unless t_tpl
134
- return false if t_tpl.empty?
135
-
136
- @mutexes.fetch(subscription_group).synchronize do
137
- rd_tpl = Rdkafka::Consumer::TopicPartitionList.new(topic.name => t_tpl)
138
-
139
- # While in theory we could lost assignment while being here, this will work and will
140
- # return us proper tpl, we do not deal with this case on this layer and report anyhow
141
- # There will not be any exception and this will operate correctly
142
- t_tpls[topic] = @clients.fetch(subscription_group).committed(rd_tpl).to_h
143
- end
144
- end
145
- end
146
- end
147
- end
148
- end
149
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Karafka Pro - Source Available Commercial Software
4
- # Copyright (c) 2017-present Maciej Mensfeld. All rights reserved.
5
- #
6
- # This software is NOT open source. It is source-available commercial software
7
- # requiring a paid license for use. It is NOT covered by LGPL.
8
- #
9
- # The author retains all right, title, and interest in this software,
10
- # including all copyrights, patents, and other intellectual property rights.
11
- # No patent rights are granted under this license.
12
- #
13
- # PROHIBITED:
14
- # - Use without a valid commercial license
15
- # - Redistribution, modification, or derivative works without authorization
16
- # - Reverse engineering, decompilation, or disassembly of this software
17
- # - Use as training data for AI/ML models or inclusion in datasets
18
- # - Scraping, crawling, or automated collection for any purpose
19
- #
20
- # PERMITTED:
21
- # - Reading, referencing, and linking for personal or commercial use
22
- # - Runtime retrieval by AI assistants, coding agents, and RAG systems
23
- # for the purpose of providing contextual help to Karafka users
24
- #
25
- # Receipt, viewing, or possession of this software does not convey or
26
- # imply any license or right beyond those expressly stated above.
27
- #
28
- # License: https://karafka.io/docs/Pro-License-Comm/
29
- # Contact: contact@karafka.io
30
-
31
- module Karafka
32
- module Pro
33
- module Processing
34
- module OffsetMetadata
35
- # Keeps track of rebalances and updates the fetcher
36
- # Since we cache the tpls with metadata, we need to invalidate them on events that would
37
- # cause changes in the assignments
38
- class Listener
39
- # When we start listening we need to register this client in the metadata fetcher, so
40
- # we have the client related to a given subscription group that we can use in fetcher
41
- # since fetcher may be used in filtering API and other places outside of the standard
42
- # consumer flow
43
- # @param event [Karafka::Core::Monitoring::Event]
44
- def on_connection_listener_before_fetch_loop(event)
45
- Fetcher.register event[:client]
46
- end
47
-
48
- # Invalidates internal cache when assignments change so we can get correct metadata
49
- # @param event [Karafka::Core::Monitoring::Event]
50
- def on_rebalance_partitions_assigned(event)
51
- Fetcher.clear event[:subscription_group]
52
- end
53
-
54
- # Invalidates internal cache when assignments change so we can get correct metadata
55
- # @param event [Karafka::Core::Monitoring::Event]
56
- def on_rebalance_partitions_revoked(event)
57
- Fetcher.clear event[:subscription_group]
58
- end
59
- end
60
- end
61
- end
62
- end
63
- end
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Karafka Pro - Source Available Commercial Software
4
- # Copyright (c) 2017-present Maciej Mensfeld. All rights reserved.
5
- #
6
- # This software is NOT open source. It is source-available commercial software
7
- # requiring a paid license for use. It is NOT covered by LGPL.
8
- #
9
- # The author retains all right, title, and interest in this software,
10
- # including all copyrights, patents, and other intellectual property rights.
11
- # No patent rights are granted under this license.
12
- #
13
- # PROHIBITED:
14
- # - Use without a valid commercial license
15
- # - Redistribution, modification, or derivative works without authorization
16
- # - Reverse engineering, decompilation, or disassembly of this software
17
- # - Use as training data for AI/ML models or inclusion in datasets
18
- # - Scraping, crawling, or automated collection for any purpose
19
- #
20
- # PERMITTED:
21
- # - Reading, referencing, and linking for personal or commercial use
22
- # - Runtime retrieval by AI assistants, coding agents, and RAG systems
23
- # for the purpose of providing contextual help to Karafka users
24
- #
25
- # Receipt, viewing, or possession of this software does not convey or
26
- # imply any license or right beyond those expressly stated above.
27
- #
28
- # License: https://karafka.io/docs/Pro-License-Comm/
29
- # Contact: contact@karafka.io
30
-
31
- module Karafka
32
- module Pro
33
- module Processing
34
- module ParallelSegments
35
- # Module for filters injected into the processing pipeline of each of the topics used
36
- # within the parallel segmented consumer groups
37
- module Filters
38
- # Base class for filters for parallel segments that deal with different feature scenarios
39
- class Base < Processing::Filters::Base
40
- # @param segment_id [Integer] numeric id of the parallel segment group to use with the
41
- # partitioner and reducer for segment matching comparison
42
- # @param partitioner [Proc]
43
- # @param reducer [Proc]
44
- def initialize(segment_id:, partitioner:, reducer:)
45
- super()
46
-
47
- @segment_id = segment_id
48
- @partitioner = partitioner
49
- @reducer = reducer
50
- end
51
-
52
- private
53
-
54
- # @param message [Karafka::Messages::Message] received message
55
- # @return [String, Numeric] segment assignment key
56
- def partition(message)
57
- @partitioner.call(message)
58
- rescue => e
59
- # This should not happen. If you are seeing this it means your partitioner code
60
- # failed and raised an error. We highly recommend mitigating partitioner level errors
61
- # on the user side because this type of collapse should be considered a last resort
62
- Karafka.monitor.instrument(
63
- "error.occurred",
64
- caller: self,
65
- error: e,
66
- message: message,
67
- type: "parallel_segments.partitioner.error"
68
- )
69
-
70
- :failure
71
- end
72
-
73
- # @param message_segment_key [String, Numeric] segment key to pass to the reducer
74
- # @return [Integer] segment assignment of a given message
75
- def reduce(message_segment_key)
76
- # Assign to segment 0 always in case of failures in partitioner
77
- # This is a fail-safe
78
- return 0 if message_segment_key == :failure
79
-
80
- @reducer.call(message_segment_key)
81
- rescue => e
82
- # @see `#partition` method error handling doc
83
- Karafka.monitor.instrument(
84
- "error.occurred",
85
- caller: self,
86
- error: e,
87
- message_segment_key: message_segment_key,
88
- type: "parallel_segments.reducer.error"
89
- )
90
-
91
- 0
92
- end
93
- end
94
- end
95
- end
96
- end
97
- end
98
- end
@@ -1,110 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Karafka Pro - Source Available Commercial Software
4
- # Copyright (c) 2017-present Maciej Mensfeld. All rights reserved.
5
- #
6
- # This software is NOT open source. It is source-available commercial software
7
- # requiring a paid license for use. It is NOT covered by LGPL.
8
- #
9
- # The author retains all right, title, and interest in this software,
10
- # including all copyrights, patents, and other intellectual property rights.
11
- # No patent rights are granted under this license.
12
- #
13
- # PROHIBITED:
14
- # - Use without a valid commercial license
15
- # - Redistribution, modification, or derivative works without authorization
16
- # - Reverse engineering, decompilation, or disassembly of this software
17
- # - Use as training data for AI/ML models or inclusion in datasets
18
- # - Scraping, crawling, or automated collection for any purpose
19
- #
20
- # PERMITTED:
21
- # - Reading, referencing, and linking for personal or commercial use
22
- # - Runtime retrieval by AI assistants, coding agents, and RAG systems
23
- # for the purpose of providing contextual help to Karafka users
24
- #
25
- # Receipt, viewing, or possession of this software does not convey or
26
- # imply any license or right beyond those expressly stated above.
27
- #
28
- # License: https://karafka.io/docs/Pro-License-Comm/
29
- # Contact: contact@karafka.io
30
-
31
- module Karafka
32
- module Pro
33
- module Processing
34
- # Processing components namespace for parallel segments feature
35
- module ParallelSegments
36
- module Filters
37
- # Filter used for handling parallel segments with automatic offset management. Handles
38
- # message distribution and ensures proper offset management when messages are filtered
39
- # out during the distribution process.
40
- #
41
- # When operating in automatic offset management mode, this filter takes care of marking
42
- # offsets of messages that were filtered out during the distribution process to maintain
43
- # proper offset progression.
44
- #
45
- # @note This is the default filter that should be used when manual offset management
46
- # is not enabled. For manual offset management scenarios use the Mom filter instead.
47
- class Default < Base
48
- # Applies the filter to the batch of messages
49
- # It removes messages that don't belong to the current parallel segment group
50
- # based on the partitioner and reducer logic
51
- #
52
- # @param messages [Array<Karafka::Messages::Message>] messages batch that we want to
53
- # filter
54
- def apply!(messages)
55
- @applied = false
56
- @all_filtered = false
57
- @cursor = messages.first
58
-
59
- # Keep track of how many messages we had initially
60
- initial_size = messages.size
61
-
62
- # Filter out messages that don't match our segment group
63
- messages.delete_if do |message|
64
- message_segment_key = partition(message)
65
-
66
- # Use the reducer to get the target group for this message
67
- target_segment = reduce(message_segment_key)
68
-
69
- # Remove the message if it doesn't belong to our group
70
- remove = target_segment != @segment_id
71
-
72
- if remove
73
- @cursor = message
74
- @applied = true
75
- end
76
-
77
- remove
78
- end
79
-
80
- # If all messages were filtered out, we want to mark them as consumed
81
- @all_filtered = messages.empty? && initial_size.positive?
82
- end
83
-
84
- # @return [Boolean] true if any messages were filtered out
85
- def applied?
86
- @applied
87
- end
88
-
89
- # @return [Boolean] true if we should mark as consumed (when all were filtered)
90
- def mark_as_consumed?
91
- @all_filtered
92
- end
93
-
94
- # @return [nil] Since we do not timeout ever in this filter, we should not return
95
- # any value for it.
96
- def timeout
97
- nil
98
- end
99
-
100
- # Only return cursor if we wanted to mark as consumed in case all was filtered.
101
- # Otherwise it could interfere with other filters
102
- def cursor
103
- @all_filtered ? @cursor : nil
104
- end
105
- end
106
- end
107
- end
108
- end
109
- end
110
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Karafka Pro - Source Available Commercial Software
4
- # Copyright (c) 2017-present Maciej Mensfeld. All rights reserved.
5
- #
6
- # This software is NOT open source. It is source-available commercial software
7
- # requiring a paid license for use. It is NOT covered by LGPL.
8
- #
9
- # The author retains all right, title, and interest in this software,
10
- # including all copyrights, patents, and other intellectual property rights.
11
- # No patent rights are granted under this license.
12
- #
13
- # PROHIBITED:
14
- # - Use without a valid commercial license
15
- # - Redistribution, modification, or derivative works without authorization
16
- # - Reverse engineering, decompilation, or disassembly of this software
17
- # - Use as training data for AI/ML models or inclusion in datasets
18
- # - Scraping, crawling, or automated collection for any purpose
19
- #
20
- # PERMITTED:
21
- # - Reading, referencing, and linking for personal or commercial use
22
- # - Runtime retrieval by AI assistants, coding agents, and RAG systems
23
- # for the purpose of providing contextual help to Karafka users
24
- #
25
- # Receipt, viewing, or possession of this software does not convey or
26
- # imply any license or right beyond those expressly stated above.
27
- #
28
- # License: https://karafka.io/docs/Pro-License-Comm/
29
- # Contact: contact@karafka.io
30
-
31
- module Karafka
32
- module Pro
33
- module Processing
34
- module ParallelSegments
35
- module Filters
36
- # Filter used for handling parallel segments when manual offset management (mom) is
37
- # enabled. Provides message distribution without any post-filtering offset state
38
- # management as it is fully user-based.
39
- #
40
- # Since with manual offset management we need to ensure that offsets are never marked
41
- # even in cases where all data in a batch is filtered out.
42
- #
43
- # This separation allows for cleaner implementation and easier debugging of each flow.
44
- #
45
- # @note This filter should be used only when manual offset management is enabled.
46
- # For automatic offset management scenarios use the regular filter instead.
47
- class Mom < Base
48
- # Applies the filter to the batch of messages
49
- # It removes messages that don't belong to the current parallel segment group
50
- # based on the partitioner and reducer logic without any offset marking
51
- #
52
- # @param messages [Array<Karafka::Messages::Message>] messages batch that we want to
53
- # filter
54
- def apply!(messages)
55
- @applied = false
56
-
57
- # Filter out messages that don't match our segment group
58
- messages.delete_if do |message|
59
- message_segment_key = partition(message)
60
- # Use the reducer to get the target group for this message
61
- target_segment = reduce(message_segment_key)
62
- # Remove the message if it doesn't belong to our segment
63
- remove = target_segment != @segment_id
64
-
65
- @applied = true if remove
66
-
67
- remove
68
- end
69
- end
70
-
71
- # @return [Boolean] true if any messages were filtered out
72
- def applied?
73
- @applied
74
- end
75
-
76
- # @return [Boolean] false, as mom mode never marks as consumed automatically
77
- def mark_as_consumed?
78
- false
79
- end
80
-
81
- # @return [nil] Since we do not timeout ever in this filter, we should not return
82
- # any value for it.
83
- def timeout
84
- nil
85
- end
86
- end
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Karafka Pro - Source Available Commercial Software
4
- # Copyright (c) 2017-present Maciej Mensfeld. All rights reserved.
5
- #
6
- # This software is NOT open source. It is source-available commercial software
7
- # requiring a paid license for use. It is NOT covered by LGPL.
8
- #
9
- # The author retains all right, title, and interest in this software,
10
- # including all copyrights, patents, and other intellectual property rights.
11
- # No patent rights are granted under this license.
12
- #
13
- # PROHIBITED:
14
- # - Use without a valid commercial license
15
- # - Redistribution, modification, or derivative works without authorization
16
- # - Reverse engineering, decompilation, or disassembly of this software
17
- # - Use as training data for AI/ML models or inclusion in datasets
18
- # - Scraping, crawling, or automated collection for any purpose
19
- #
20
- # PERMITTED:
21
- # - Reading, referencing, and linking for personal or commercial use
22
- # - Runtime retrieval by AI assistants, coding agents, and RAG systems
23
- # for the purpose of providing contextual help to Karafka users
24
- #
25
- # Receipt, viewing, or possession of this software does not convey or
26
- # imply any license or right beyond those expressly stated above.
27
- #
28
- # License: https://karafka.io/docs/Pro-License-Comm/
29
- # Contact: contact@karafka.io
30
-
31
- module Karafka
32
- module Pro
33
- module Processing
34
- # Namespace for periodic jobs related processing APIs
35
- module PeriodicJob
36
- # Consumer extra methods useful only when periodic jobs are in use
37
- module Consumer
38
- class << self
39
- # Defines an empty `#tick` method if not present
40
- #
41
- # We define it that way due to our injection strategy flow.
42
- #
43
- # @param consumer_singleton_class [Karafka::BaseConsumer] consumer singleton class
44
- # that is being enriched with periodic jobs API
45
- def included(consumer_singleton_class)
46
- # Do not define empty tick method on consumer if it already exists
47
- # We only define it when it does not exist to have empty periodic ticking
48
- #
49
- # We need to check both cases (public and private) since user is not expected to
50
- # have this method public
51
- return if consumer_singleton_class.method_defined?(:tick)
52
- return if consumer_singleton_class.private_instance_methods.include?(:tick)
53
-
54
- # Create empty ticking method
55
- consumer_singleton_class.class_eval do
56
- def tick
57
- end
58
- end
59
- end
60
- end
61
-
62
- # Runs the on-schedule tick periodic operations
63
- # This method is an alias but is part of the naming convention used for other flows, this
64
- # is why we do not reference the `handle_before_schedule_tick` directly
65
- def on_before_schedule_tick
66
- handle_before_schedule_tick
67
- end
68
-
69
- # Used by the executor to trigger consumer tick
70
- # @private
71
- def on_tick
72
- handle_tick
73
- rescue => e
74
- Karafka.monitor.instrument(
75
- "error.occurred",
76
- error: e,
77
- caller: self,
78
- type: "consumer.tick.error"
79
- )
80
- end
81
- end
82
- end
83
- end
84
- end
85
- end