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
data/lib/karafka/admin.rb CHANGED
@@ -38,6 +38,21 @@ module Karafka
38
38
  @custom_kafka = kafka
39
39
  end
40
40
 
41
+ # No-op close to normalize the API surface.
42
+ #
43
+ # Each admin operation currently opens and closes its own underlying rdkafka admin instance
44
+ # internally, so there is nothing to release at the `Karafka::Admin` level right now. This
45
+ # method exists so that callers who hold an instance and call `#close` on it (matching the
46
+ # pattern of other closeable resources) do not raise `NoMethodError`.
47
+ #
48
+ # In the future, `Karafka::Admin` is planned to be refactored to reuse a single rdkafka admin
49
+ # instance across multiple operations rather than creating and tearing one down per call. When
50
+ # that happens, this method will need to release that shared instance. The no-op is here now
51
+ # so that all callers are already written against the correct API and require no changes when
52
+ # the real implementation lands.
53
+ def close
54
+ end
55
+
41
56
  class << self
42
57
  # Delegate topic-related operations to Topics class
43
58
 
@@ -80,18 +95,25 @@ module Karafka
80
95
  new.read_watermark_offsets(name_or_hash, partition)
81
96
  end
82
97
 
98
+ # @param topic_partition_offsets [Hash{String => Array<Hash>}] topics with partition specs
99
+ # @param isolation_level [Integer, nil] optional isolation level constant
100
+ # @see Topics.read_partition_offsets
101
+ def read_partition_offsets(topic_partition_offsets, isolation_level: nil)
102
+ new.read_partition_offsets(topic_partition_offsets, isolation_level: isolation_level)
103
+ end
104
+
83
105
  # @param topic_name [String] name of the topic we're interested in
84
106
  # @see Topics.info
85
107
  def topic_info(topic_name)
86
108
  new.topic_info(topic_name)
87
109
  end
88
110
 
89
- # @param consumer_group_id [String] id of the consumer group for which we want to move the
111
+ # @param group_id [String] id of the group for which we want to move the
90
112
  # existing offset
91
113
  # @param topics_with_partitions_and_offsets [Hash] Hash with list of topics and settings
92
114
  # @see ConsumerGroups.seek
93
- def seek_consumer_group(consumer_group_id, topics_with_partitions_and_offsets)
94
- new.seek_consumer_group(consumer_group_id, topics_with_partitions_and_offsets)
115
+ def seek_consumer_group(group_id, topics_with_partitions_and_offsets)
116
+ new.seek_consumer_group(group_id, topics_with_partitions_and_offsets)
95
117
  end
96
118
 
97
119
  # Takes consumer group and its topics and copies all the offsets to a new named group
@@ -124,36 +146,35 @@ module Karafka
124
146
  )
125
147
  end
126
148
 
127
- # Removes given consumer group (if exists)
149
+ # Removes given group (if exists)
128
150
  #
129
- # @param consumer_group_id [String] consumer group name
151
+ # @param group_id [String] group name
130
152
  # @see ConsumerGroups.delete
131
- def delete_consumer_group(consumer_group_id)
132
- new.delete_consumer_group(consumer_group_id)
153
+ def delete_consumer_group(group_id)
154
+ new.delete_consumer_group(group_id)
133
155
  end
134
156
 
135
- # Triggers a rebalance for the specified consumer group
157
+ # Triggers a rebalance for the specified group
136
158
  #
137
- # @param consumer_group_id [String] consumer group id to trigger rebalance for
159
+ # @param group_id [String] group id to trigger rebalance for
138
160
  # @see ConsumerGroups.trigger_rebalance
139
161
  # @note This API should be used only for development.
140
- def trigger_rebalance(consumer_group_id)
141
- new.trigger_rebalance(consumer_group_id)
162
+ def trigger_rebalance(group_id)
163
+ new.trigger_rebalance(group_id)
142
164
  end
143
165
 
144
- # Reads lags and offsets for given topics in the context of consumer groups defined in the
145
- # routing
146
- # @param consumer_groups_with_topics [Hash{String => Array<String>}] hash with consumer
147
- # groups names with array of topics to query per consumer group inside
166
+ # Reads lags and offsets for given topics in the context of groups defined in the routing
167
+ # @param groups_with_topics [Hash{String => Array<String>}] hash with group
168
+ # names with array of topics to query per group inside
148
169
  # @param active_topics_only [Boolean] if set to false, when we use routing topics, will
149
170
  # select also topics that are marked as inactive in routing
150
171
  # @return [Hash{String => Hash{Integer => Hash{Integer => Object}}}] hash where the top
151
- # level keys are the consumer groups and values are hashes with topics and inside
172
+ # level keys are the groups and values are hashes with topics and inside
152
173
  # partitions with lags and offsets
153
174
  # @see ConsumerGroups.read_lags_with_offsets
154
- def read_lags_with_offsets(consumer_groups_with_topics = {}, active_topics_only: true)
175
+ def read_lags_with_offsets(groups_with_topics = {}, active_topics_only: true)
155
176
  new.read_lags_with_offsets(
156
- consumer_groups_with_topics,
177
+ groups_with_topics,
157
178
  active_topics_only: active_topics_only
158
179
  )
159
180
  end
@@ -268,18 +289,25 @@ module Karafka
268
289
  Topics.new(kafka: @custom_kafka).read_watermark_offsets(name_or_hash, partition)
269
290
  end
270
291
 
292
+ # @param topic_partition_offsets [Hash{String => Array<Hash>}] topics with partition specs
293
+ # @param isolation_level [Integer, nil] optional isolation level constant
294
+ # @see Topics#read_partition_offsets
295
+ def read_partition_offsets(topic_partition_offsets, isolation_level: nil)
296
+ Topics.new(kafka: @custom_kafka).read_partition_offsets(topic_partition_offsets, isolation_level: isolation_level)
297
+ end
298
+
271
299
  # @param topic_name [String] name of the topic we're interested in
272
300
  # @see Topics#info
273
301
  def topic_info(topic_name)
274
302
  Topics.new(kafka: @custom_kafka).info(topic_name)
275
303
  end
276
304
 
277
- # @param consumer_group_id [String] consumer group for which we want to move offsets
305
+ # @param group_id [String] group for which we want to move offsets
278
306
  # @param topics_with_partitions_and_offsets [Hash] hash with topics and settings
279
307
  # @see ConsumerGroups#seek
280
- def seek_consumer_group(consumer_group_id, topics_with_partitions_and_offsets)
308
+ def seek_consumer_group(group_id, topics_with_partitions_and_offsets)
281
309
  ConsumerGroups.new(kafka: @custom_kafka).seek(
282
- consumer_group_id,
310
+ group_id,
283
311
  topics_with_partitions_and_offsets
284
312
  )
285
313
  end
@@ -306,25 +334,25 @@ module Karafka
306
334
  )
307
335
  end
308
336
 
309
- # @param consumer_group_id [String] consumer group name
337
+ # @param group_id [String] group name
310
338
  # @see ConsumerGroups#delete
311
- def delete_consumer_group(consumer_group_id)
312
- ConsumerGroups.new(kafka: @custom_kafka).delete(consumer_group_id)
339
+ def delete_consumer_group(group_id)
340
+ ConsumerGroups.new(kafka: @custom_kafka).delete(group_id)
313
341
  end
314
342
 
315
- # @param consumer_group_id [String] consumer group id to trigger rebalance for
343
+ # @param group_id [String] group id to trigger rebalance for
316
344
  # @see ConsumerGroups#trigger_rebalance
317
- def trigger_rebalance(consumer_group_id)
318
- ConsumerGroups.new(kafka: @custom_kafka).trigger_rebalance(consumer_group_id)
345
+ def trigger_rebalance(group_id)
346
+ ConsumerGroups.new(kafka: @custom_kafka).trigger_rebalance(group_id)
319
347
  end
320
348
 
321
- # @param consumer_groups_with_topics [Hash{String => Array<String>}] hash with consumer
322
- # groups names with array of topics
349
+ # @param groups_with_topics [Hash{String => Array<String>}] hash with group
350
+ # names with array of topics
323
351
  # @param active_topics_only [Boolean] if set to false, will select also inactive topics
324
352
  # @see ConsumerGroups#read_lags_with_offsets
325
- def read_lags_with_offsets(consumer_groups_with_topics = {}, active_topics_only: true)
353
+ def read_lags_with_offsets(groups_with_topics = {}, active_topics_only: true)
326
354
  ConsumerGroups.new(kafka: @custom_kafka).read_lags_with_offsets(
327
- consumer_groups_with_topics,
355
+ groups_with_topics,
328
356
  active_topics_only: active_topics_only
329
357
  )
330
358
  end
data/lib/karafka/app.rb CHANGED
@@ -37,18 +37,29 @@ module Karafka
37
37
  # We then narrow this to active consumer groups from which we select active subscription
38
38
  # groups.
39
39
  consumer_groups
40
- .map { |cg| [cg, cg.subscription_groups] }
41
- .select { |cg, _| cg.active? }
40
+ .map { |group| [group, group.subscription_groups] }
41
+ .select { |group, _| group.active? }
42
42
  .select { |_, sgs| sgs.delete_if { |sg| !sg.active? } }
43
43
  .delete_if { |_, sgs| sgs.empty? }
44
- .each { |_, sgs| sgs.each { |sg| sg.topics.delete_if { |top| !top.active? } } }
44
+ .each { |_, sgs| sgs.each { |sg| sg.topics.delete_if { |topic| !topic.active? } } }
45
45
  .each { |_, sgs| sgs.delete_if { |sg| sg.topics.empty? } }
46
- .reject { |cg, _| cg.subscription_groups.empty? }
46
+ .reject { |group, _| group.subscription_groups.empty? }
47
47
  .to_h
48
48
  end
49
49
 
50
+ # @return [Karafka::Declaratives::Builder] declaratives builder instance
51
+ def declaratives
52
+ config
53
+ .internal
54
+ .declaratives
55
+ .builder
56
+ end
57
+
50
58
  # Just a nicer name for the consumer groups
51
59
  alias_method :routes, :consumer_groups
60
+ # Generalized alias — routing entries are "groups" (consumer groups today, other kinds
61
+ # of groups like KIP-932 share groups in the future).
62
+ alias_method :groups, :consumer_groups
52
63
 
53
64
  # Returns current assignments of this process. Both topics and partitions
54
65
  #
@@ -108,7 +119,7 @@ module Karafka
108
119
  config.kafka[:debug] = contexts
109
120
  producer.config.kafka[:debug] = contexts
110
121
 
111
- consumer_groups.map(&:topics).flat_map(&:to_a).each do |topic|
122
+ routes.map(&:topics).flat_map(&:to_a).each do |topic|
112
123
  topic.kafka[:debug] = contexts
113
124
  end
114
125
  end
@@ -26,7 +26,7 @@ module Karafka
26
26
  attr_accessor :messages
27
27
  # @return [Karafka::Connection::Client] kafka connection client
28
28
  attr_accessor :client
29
- # @return [Karafka::Processing::Coordinator] coordinator
29
+ # @return [Karafka::Processing::ConsumerGroups::Coordinator] coordinator
30
30
  attr_accessor :coordinator
31
31
  # @return [Waterdrop::Producer] producer instance
32
32
  attr_accessor :producer
@@ -304,7 +304,7 @@ module Karafka
304
304
  # @return [Boolean] was this consumer in active use. Active use means running `#consume` at
305
305
  # least once. Consumer may have to run `#revoked` or `#shutdown` despite not running
306
306
  # `#consume` previously in delayed job cases and other cases that potentially involve running
307
- # the `Jobs::Idle` for house-keeping
307
+ # the `ConsumerGroups::Jobs::Idle` for house-keeping
308
308
  def used?
309
309
  @used
310
310
  end
@@ -16,7 +16,7 @@ module Karafka
16
16
  include
17
17
  exclude
18
18
  ].each do |action|
19
- optional(:"#{action}_consumer_groups") { |cg| cg.is_a?(Array) }
19
+ optional(:"#{action}_consumer_groups") { |val| val.is_a?(Array) }
20
20
  optional(:"#{action}_subscription_groups") { |sg| sg.is_a?(Array) }
21
21
  optional(:"#{action}_topics") { |topics| topics.is_a?(Array) }
22
22
 
@@ -28,7 +28,7 @@ module Karafka
28
28
  # If there were no consumer_groups declared in the server cli, it means that we will
29
29
  # run all of them and no need to validate them here at all
30
30
  next if value.empty?
31
- next if (value - Karafka::App.consumer_groups.map(&:name)).empty?
31
+ next if (value - Karafka::App.routes.map(&:name)).empty?
32
32
 
33
33
  # Found unknown consumer groups
34
34
  [[[:"#{action}_consumer_groups"], :consumer_groups_inclusion]]
@@ -44,7 +44,7 @@ module Karafka
44
44
  next if value.empty?
45
45
 
46
46
  subscription_groups = Karafka::App
47
- .consumer_groups
47
+ .routes
48
48
  .map(&:subscription_groups)
49
49
  .flatten
50
50
  .map(&:name)
@@ -65,7 +65,7 @@ module Karafka
65
65
  next if value.empty?
66
66
 
67
67
  topics = Karafka::App
68
- .consumer_groups
68
+ .routes
69
69
  .map(&:subscription_groups)
70
70
  .flatten
71
71
  .map(&:topics)
@@ -41,7 +41,7 @@ module Karafka
41
41
  "Karafka version: #{Karafka::VERSION}#{postfix}",
42
42
  "Ruby version: #{RUBY_DESCRIPTION}",
43
43
  "Rdkafka version: #{::Rdkafka::VERSION}",
44
- "Consumer groups count: #{Karafka::App.consumer_groups.size}",
44
+ "Consumer groups count: #{Karafka::App.routes.size}",
45
45
  "Subscription groups count: #{Karafka::App.subscription_groups.values.flatten.size}",
46
46
  "Workers count: #{concurrency}",
47
47
  "Instance client id: #{client_id}",
@@ -29,28 +29,20 @@ module Karafka
29
29
  raise Errors::CommandValidationError, cause: e
30
30
  end
31
31
 
32
- # @return [Array<Karafka::Routing::Topic>] all available topics that can be managed
33
- # @note If topic is defined in multiple consumer groups, first config will be used. This
34
- # means, that this CLI will not work for simultaneous management of multiple clusters
35
- # from a single CLI command execution flow.
32
+ # @return [Array<Karafka::Declaratives::Topic>] all available topics that can be managed
33
+ # @note Topics with bootstrap servers that differ from the default kafka config are
34
+ # considered to belong to a different cluster and are excluded.
36
35
  def declaratives_routing_topics
37
- return @declaratives_routing_topics if @declaratives_routing_topics
36
+ @declaratives_routing_topics ||= begin
37
+ default_servers = kafka_config[:"bootstrap.servers"]
38
38
 
39
- collected_topics = {}
40
- default_servers = kafka_config[:"bootstrap.servers"]
41
-
42
- App.consumer_groups.each do |consumer_group|
43
- consumer_group.topics.each do |topic|
44
- # Skip topics that were explicitly disabled from management
45
- next unless topic.declaratives.active?
46
- # If bootstrap servers are different, consider this a different cluster
47
- next unless default_servers == topic.kafka[:"bootstrap.servers"]
48
-
49
- collected_topics[topic.name] ||= topic
39
+ App.declaratives.topics.reject do |topic|
40
+ # Topics with explicit bootstrap servers that differ from the default are on a
41
+ # different cluster. Topics without bootstrap_servers set (e.g. from the standalone
42
+ # DSL) are assumed to belong to the default cluster.
43
+ topic.bootstrap_servers && topic.bootstrap_servers != default_servers
50
44
  end
51
45
  end
52
-
53
- @declaratives_routing_topics = collected_topics.values
54
46
  end
55
47
 
56
48
  # @return [Array<Hash>] existing topics details
@@ -17,7 +17,7 @@ module Karafka
17
17
  declaratives_routing_topics.each do |topic|
18
18
  name = topic.name
19
19
 
20
- desired_count = topic.config.partitions
20
+ desired_count = topic.declaratives.partitions
21
21
  existing_count = existing_partitions.fetch(name, false)
22
22
 
23
23
  if existing_count && existing_count < desired_count
@@ -70,8 +70,11 @@ module Karafka
70
70
  @closed = false
71
71
  @subscription_group = subscription_group
72
72
  @buffer = RawMessagesBuffer.new
73
- @rebalance_manager = RebalanceManager.new(@subscription_group.id, @buffer)
74
- @rebalance_callback = Instrumentation::Callbacks::Rebalance.new(@subscription_group, id)
73
+ @rebalance_manager = ConsumerGroups::RebalanceManager.new(@subscription_group.id, @buffer)
74
+ @rebalance_callback = Instrumentation::Callbacks::ConsumerGroups::Rebalance.new(
75
+ @subscription_group,
76
+ id
77
+ )
75
78
  @mode = Mode.new
76
79
 
77
80
  @interval_runner = Helpers::IntervalRunner.new do
@@ -401,10 +404,14 @@ module Karafka
401
404
  # - OAUTHBEARER token refresh callbacks
402
405
  #
403
406
  # @param timeout [Integer] number of milliseconds to wait on events or 0 not to wait.
407
+ # @param safe [Boolean] when true, rescues Rdkafka::RdkafkaError so callers in
408
+ # shutdown/quiet paths do not trigger a full listener reset. When shutting down, errors
409
+ # at this layer are not relevant enough. We want to log them but we should not propagate
410
+ # them any further.
404
411
  #
405
412
  # @note It is non-blocking when timeout 0 and will not wait if queue empty. It costs up to
406
413
  # 2ms when no callbacks are triggered.
407
- def events_poll(timeout = 0)
414
+ def events_poll(timeout = 0, safe: false)
408
415
  kafka.events_poll(timeout)
409
416
 
410
417
  # Emit event for monitoring - happens once per tick_interval (default 5s)
@@ -414,6 +421,8 @@ module Karafka
414
421
  caller: self,
415
422
  subscription_group: @subscription_group
416
423
  )
424
+ rescue Rdkafka::RdkafkaError
425
+ safe ? nil : raise
417
426
  end
418
427
 
419
428
  # Returns pointer to the consumer group metadata. It is used only in the context of
@@ -727,9 +736,9 @@ module Karafka
727
736
  # Register statistics runner for this particular type of callbacks
728
737
  Karafka::Core::Instrumentation.statistics_callbacks.add(
729
738
  @subscription_group.id,
730
- Instrumentation::Callbacks::Statistics.new(
739
+ Instrumentation::Callbacks::ConsumerGroups::Statistics.new(
731
740
  @subscription_group.id,
732
- @subscription_group.consumer_group.id,
741
+ @subscription_group.group.id,
733
742
  @name
734
743
  )
735
744
  )
@@ -737,9 +746,9 @@ module Karafka
737
746
  # Register error tracking callback
738
747
  Karafka::Core::Instrumentation.error_callbacks.add(
739
748
  @subscription_group.id,
740
- Instrumentation::Callbacks::Error.new(
749
+ Instrumentation::Callbacks::ConsumerGroups::Error.new(
741
750
  @subscription_group.id,
742
- @subscription_group.consumer_group.id,
751
+ @subscription_group.group.id,
743
752
  @name
744
753
  )
745
754
  )
@@ -765,6 +774,29 @@ module Karafka
765
774
  end
766
775
 
767
776
  consumer
777
+ rescue
778
+ # If anything past the consumer allocation raises (e.g., subscribe/assign failing due to
779
+ # DNS, unknown_topic_or_part, unreleased_instance_id for static group membership,
780
+ # transient broker issues, etc.), we must clean up the native rdkafka handle and the
781
+ # callback registry entries we just added. Otherwise the oauth callback keeps a strong
782
+ # reference to the consumer, pinning it from GC, and the native rd_kafka_t plus its
783
+ # internal pipe FDs and housekeeping threads leak. Callers up the stack (the listener
784
+ # rescue + reset loop) will simply retry build_consumer.
785
+ sg_id = @subscription_group.id
786
+ Karafka::Core::Instrumentation.statistics_callbacks.delete(sg_id)
787
+ Karafka::Core::Instrumentation.error_callbacks.delete(sg_id)
788
+ Karafka::Core::Instrumentation.oauthbearer_token_refresh_callbacks.delete(sg_id)
789
+
790
+ # Close safely if the consumer was allocated. Native kafka was never started
791
+ # (native_kafka_auto_start: false and we did not reach @kafka.start), so close only
792
+ # destroys the inner handle without needing to join any polling thread.
793
+ begin
794
+ consumer&.close
795
+ rescue
796
+ nil
797
+ end
798
+
799
+ raise
768
800
  end
769
801
 
770
802
  # @return [Rdkafka::Consumer] librdkafka consumer instance
@@ -783,8 +815,7 @@ module Karafka
783
815
  # Decides whether or not we should unsubscribe prior to closing.
784
816
  #
785
817
  # We cannot do it when there is a static group membership assignment as it would be
786
- # reassigned.
787
- # We cannot do it also for assign mode because then there are no subscriptions
818
+ # reassigned. We cannot do it also for assign mode because then there are no subscriptions
788
819
  # We also do not do it if there are no assignments at all as it does not make sense
789
820
  #
790
821
  # @return [Boolean] should we unsubscribe prior to shutdown
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Karafka
4
+ module Connection
5
+ # Consumer-group-specific connection components (rebalance handling driven by consumer group
6
+ # protocol). Parallel `ShareGroups` will live next to this namespace once KIP-932 lands.
7
+ module ConsumerGroups
8
+ # Manager for tracking changes in the partitions assignment after the assignment is done and
9
+ # for ensuring, that proper buffer related operations that may be impacted by the rebalance
10
+ # state are applied.
11
+ #
12
+ # We need tracking of those to clean up consumers that will no longer process given
13
+ # partitions as they were taken away.
14
+ #
15
+ # @note Since this does not happen really often, we try to stick with same objects for the
16
+ # empty states most of the time, so we don't create many objects during the manager life
17
+ #
18
+ # @note Internally in the rebalance manager we have a notion of lost partitions. Partitions
19
+ # that are lost, are those that got revoked but did not get re-assigned back. We do not
20
+ # expose this concept outside and we normalize to have them revoked, as it is irrelevant
21
+ # from the rest of the code perspective as only those that are lost are truly revoked.
22
+ #
23
+ # @note For cooperative-sticky `#assigned_partitions` holds only the recently assigned
24
+ # partitions, not all the partitions that are owned
25
+ #
26
+ # @note We have to have the `subscription_group` reference because we have a global pipeline
27
+ # for notifications and we need to make sure we track changes only for things that are of
28
+ # relevance to our subscription group
29
+ class RebalanceManager
30
+ # Empty array for internal usage not to create new objects
31
+ EMPTY_ARRAY = [].freeze
32
+
33
+ attr_reader :assigned_partitions, :revoked_partitions
34
+
35
+ private_constant :EMPTY_ARRAY
36
+
37
+ # @param subscription_group_id [String] subscription group id
38
+ # @param buffer [Karafka::Connection::RawMessagesBuffer]
39
+ # @return [RebalanceManager]
40
+ def initialize(subscription_group_id, buffer)
41
+ @assigned_partitions = {}
42
+ @revoked_partitions = {}
43
+ @changed = false
44
+ @active = false
45
+ @subscription_group_id = subscription_group_id
46
+ @buffer = buffer
47
+
48
+ # Connects itself to the instrumentation pipeline so rebalances can be tracked
49
+ Karafka.monitor.subscribe(self)
50
+ end
51
+
52
+ # Resets the rebalance manager state
53
+ # This needs to be done before each polling loop as during the polling, the state may be
54
+ # changed
55
+ def clear
56
+ @assigned_partitions.clear
57
+ @revoked_partitions.clear
58
+ @changed = false
59
+ end
60
+
61
+ # @return [Boolean] indicates a state change in the partitions assignment
62
+ def changed?
63
+ @changed
64
+ end
65
+
66
+ # @return [Boolean] true if there was at least one rebalance
67
+ # @note This method is needed to make sure that when using cooperative-sticky, we do not
68
+ # close until first rebalance. Otherwise librdkafka may crash.
69
+ # @see https://github.com/confluentinc/librdkafka/issues/4312
70
+ def active?
71
+ @active
72
+ end
73
+
74
+ # Callback that kicks in inside of rdkafka, when new partitions were assigned.
75
+ #
76
+ # @private
77
+ # @param event [Karafka::Core::Monitoring::Event]
78
+ def on_rebalance_partitions_assigned(event)
79
+ # Apply changes only for our subscription group
80
+ return unless event[:subscription_group_id] == @subscription_group_id
81
+
82
+ @active = true
83
+ @assigned_partitions = event[:tpl].to_h.transform_values { |part| part.map(&:partition) }
84
+ @changed = true
85
+ end
86
+
87
+ # Callback that kicks in inside of rdkafka, when partitions were revoked.
88
+ #
89
+ # @private
90
+ # @param event [Karafka::Core::Monitoring::Event]
91
+ def on_rebalance_partitions_revoked(event)
92
+ # Apply changes only for our subscription group
93
+ return unless event[:subscription_group_id] == @subscription_group_id
94
+
95
+ @active = true
96
+ @revoked_partitions = event[:tpl].to_h.transform_values { |part| part.map(&:partition) }
97
+ @changed = true
98
+
99
+ remove_revoked_and_duplicated_messages
100
+ end
101
+
102
+ private
103
+
104
+ # We may have a case where in the middle of data polling, we've lost a partition.
105
+ # In a case like this we should remove all the pre-buffered messages from list partitions
106
+ # as we are no longer responsible in a given process for processing those messages and
107
+ # they should have been picked up by a different process.
108
+ def remove_revoked_and_duplicated_messages
109
+ @revoked_partitions.each do |topic, partitions|
110
+ partitions.each do |partition|
111
+ @buffer.delete(topic, partition)
112
+ end
113
+ end
114
+
115
+ @buffer.uniq!
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -13,8 +13,8 @@ module Karafka
13
13
  include Helpers::Async
14
14
 
15
15
  include Helpers::ConfigImporter.new(
16
- jobs_builder: %i[internal processing jobs_builder],
17
- partitioner_class: %i[internal processing partitioner_class],
16
+ jobs_builder: %i[internal processing consumer_groups jobs_builder],
17
+ partitioner_class: %i[internal processing consumer_groups partitioner_class],
18
18
  reset_backoff: %i[internal connection reset_backoff],
19
19
  listener_thread_priority: %i[internal connection listener_thread_priority]
20
20
  )
@@ -26,7 +26,7 @@ module Karafka
26
26
  # @return [Karafka::Routing::SubscriptionGroup] subscription group that this listener handles
27
27
  attr_reader :subscription_group
28
28
 
29
- # @return [Processing::CoordinatorsBuffer] coordinator buffers that can be used directly in
29
+ # @return [Processing::ConsumerGroups::CoordinatorsBuffer] coordinator buffers that can be used directly in
30
30
  # advanced cases of changes to the polling flow (like triggered seek back without messages
31
31
  # ahead in the topic)
32
32
  attr_reader :coordinators
@@ -45,12 +45,12 @@ module Karafka
45
45
  @id = SecureRandom.hex(6)
46
46
  @subscription_group = subscription_group
47
47
  @jobs_queue = jobs_queue
48
- @coordinators = Processing::CoordinatorsBuffer.new(subscription_group.topics)
48
+ @coordinators = Processing::ConsumerGroups::CoordinatorsBuffer.new(subscription_group.topics)
49
49
  @client = Client.new(@subscription_group, -> { running? })
50
- @executors = Processing::ExecutorsBuffer.new(@client, subscription_group)
50
+ @executors = Processing::ConsumerGroups::ExecutorsBuffer.new(@client, subscription_group)
51
51
  @partitioner = partitioner_class.new(subscription_group)
52
52
  @scheduler = scheduler
53
- @events_poller = Helpers::IntervalRunner.new { @client.events_poll }
53
+ @events_poller = Helpers::IntervalRunner.new { |**opts| @client.events_poll(**opts) }
54
54
  # We keep one buffer for messages to preserve memory and not allocate extra objects
55
55
  # We can do this that way because we always first schedule jobs using messages before we
56
56
  # fetch another batch.
@@ -499,6 +499,7 @@ module Karafka
499
499
  until wait_until.call
500
500
  @client.ping
501
501
  @scheduler.on_manage
502
+ @events_poller.call(safe: true)
502
503
 
503
504
  after_ping.call
504
505
  sleep(0.2)
@@ -520,7 +521,7 @@ module Karafka
520
521
  @client.reset
521
522
  @coordinators.reset
522
523
  @interval_runner.reset
523
- @executors = Processing::ExecutorsBuffer.new(@client, @subscription_group)
524
+ @executors = Processing::ConsumerGroups::ExecutorsBuffer.new(@client, @subscription_group)
524
525
  end
525
526
  end
526
527
  end
@@ -13,7 +13,7 @@ module Karafka
13
13
  # should be able to distribute work whenever any work is done in any of the listeners
14
14
  scheduler = App.config.internal.processing.scheduler_class.new(jobs_queue)
15
15
 
16
- @batch = App.subscription_groups.flat_map do |_consumer_group, subscription_groups|
16
+ @batch = App.subscription_groups.flat_map do |_group, subscription_groups|
17
17
  subscription_groups.map do |subscription_group|
18
18
  Connection::Listener.new(
19
19
  subscription_group,
@@ -31,8 +31,7 @@ module Karafka
31
31
  end
32
32
 
33
33
  # Define query and setter methods for each mode using meta-programming
34
- # This creates methods like: subscribe?, assign?
35
- # And bang methods like: subscribe!, assign!
34
+ # This creates methods like: subscribe?, assign? And bang methods like: subscribe!, assign!
36
35
  MODES.each do |mode_name|
37
36
  # @return [Boolean] true if the current mode matches this mode
38
37
  define_method("#{mode_name}?") do
@@ -108,11 +108,6 @@ module Karafka
108
108
  # we save ourselves some objects allocations. We cannot clear the underlying arrays as they
109
109
  # may be used in other threads for data processing, thus if we would clear it, we could
110
110
  # potentially clear a raw messages array for a job that is in the jobs queue.
111
- #
112
- # @note We do not clear the eof assignments because they can span across batch pollings.
113
- # Since eof is not raised non-stop and is silenced after an eof poll, if we would clean it
114
- # here we would loose the notion of it. The reset state for it should happen when we do
115
- # discover new messages for given topic partition.
116
111
  def clear
117
112
  @size = 0
118
113
  @groups.each_value(&:clear)