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
@@ -3,12 +3,22 @@
3
3
  module Karafka
4
4
  module Routing
5
5
  # Topic stores all the details on how we should interact with Kafka given topic.
6
- # It belongs to a consumer group as from 0.6 all the topics can work in the same consumer group
6
+ # It belongs to a group as from 0.6 all the topics can work in the same group
7
7
  # It is a part of Karafka's DSL.
8
+ #
9
+ # @note `#group` is the polymorphic reference to the owning group. Today this is always a
10
+ # {ConsumerGroup}, but the accessor is named generically in preparation for additional group
11
+ # types (e.g. KIP-932 share groups). `#consumer_group` is kept as an alias for backwards
12
+ # compatibility.
8
13
  class Topic
9
- attr_reader :id, :name, :consumer_group
14
+ attr_reader :id, :name, :group
10
15
  attr_writer :consumer
11
16
 
17
+ # Backwards compatible alias for `#group`. Kept purely for compatibility — this is an
18
+ # unconditional alias and performs no type validation, so callers should prefer `#group`
19
+ # once additional group types (e.g. KIP-932 share groups) land.
20
+ alias_method :consumer_group, :group
21
+
12
22
  attr_accessor :subscription_group_details
13
23
 
14
24
  # Full subscription group reference can be built only when we have knowledge about the
@@ -30,16 +40,17 @@ module Karafka
30
40
  private_constant :INHERITABLE_ATTRIBUTES
31
41
 
32
42
  # @param name [String, Symbol] name of a topic on which we want to listen
33
- # @param consumer_group [Karafka::Routing::ConsumerGroup] owning consumer group of this topic
34
- def initialize(name, consumer_group)
43
+ # @param group [Karafka::Routing::ConsumerGroup] owning group of this topic. Polymorphic
44
+ # placeholder for future group types (e.g. share groups); today always a ConsumerGroup.
45
+ def initialize(name, group)
35
46
  @name = name.to_s
36
- @consumer_group = consumer_group
47
+ @group = group
37
48
  @attributes = {}
38
49
  @active = true
39
- # @note We use identifier related to the consumer group that owns a topic, because from
40
- # Karafka 0.6 we can handle multiple Kafka instances with the same process and we can
41
- # have same topic name across multiple consumer groups
42
- @id = "#{consumer_group.id}_#{@name}"
50
+ # @note We use identifier related to the group that owns a topic, because from Karafka 0.6
51
+ # we can handle multiple Kafka instances with the same process and we can have same
52
+ # topic name across multiple groups
53
+ @id = "#{group.id}_#{@name}"
43
54
  @consumer = nil
44
55
  @active_assigned = false
45
56
  @subscription_group_details = nil
@@ -133,7 +144,7 @@ module Karafka
133
144
  end
134
145
 
135
146
  # @return [Hash] hash with all the topic attributes
136
- # @note This is being used when we validate the consumer_group and its topics
147
+ # @note This is being used when we validate the group and its topics
137
148
  def to_h
138
149
  map = INHERITABLE_ATTRIBUTES.map do |attribute|
139
150
  [attribute, public_send(attribute)]
@@ -144,7 +155,10 @@ module Karafka
144
155
  name: name,
145
156
  active: active?,
146
157
  consumer: consumer,
147
- consumer_group_id: consumer_group.id,
158
+ group_id: group.id,
159
+ # Kept as a reference alongside `group_id` for backwards compatibility. Will be removed
160
+ # in Karafka 3.0.
161
+ consumer_group_id: group.id,
148
162
  subscription_group_details: subscription_group_details
149
163
  ).freeze
150
164
  end
@@ -4,20 +4,20 @@ module Karafka
4
4
  # Class used to run the Karafka listeners in separate threads
5
5
  class Runner
6
6
  include Helpers::ConfigImporter.new(
7
- worker_thread_priority: %i[worker_thread_priority],
8
7
  manager: %i[internal connection manager],
9
- conductor: %i[internal connection conductor],
10
- jobs_queue_class: %i[internal processing jobs_queue_class]
8
+ conductor: %i[internal connection conductor]
11
9
  )
12
10
 
13
11
  # Starts listening on all the listeners asynchronously and handles the jobs queue closing
14
12
  # after listeners are done with their work.
15
13
  def call
16
- # Despite possibility of having several independent listeners, we aim to have one queue for
17
- # jobs across and one workers poll for that
18
- jobs_queue = jobs_queue_class.new
14
+ jobs_queue = Karafka::Server.jobs_queue
15
+ workers = Karafka::Server.workers
16
+
17
+ # Wire up the circular dependency between pool and queue
18
+ workers.jobs_queue = jobs_queue
19
+ jobs_queue.pool = workers
19
20
 
20
- workers = Processing::WorkersBatch.new(jobs_queue)
21
21
  listeners = Connection::ListenersBatch.new(jobs_queue)
22
22
 
23
23
  # We mark it prior to delegating to the manager as manager will have to start at least one
@@ -27,17 +27,12 @@ module Karafka
27
27
  # Register all the listeners so they can be started and managed
28
28
  manager.register(listeners)
29
29
 
30
- workers.each_with_index do |worker, i|
31
- worker.async_call(
32
- "karafka.worker##{i}",
33
- worker_thread_priority
34
- )
35
- end
36
-
37
30
  # We aggregate threads here for a supervised shutdown process
38
- Karafka::Server.workers = workers
39
31
  Karafka::Server.listeners = listeners
40
- Karafka::Server.jobs_queue = jobs_queue
32
+
33
+ # Start worker threads after listeners are created so a failure in the boot steps above
34
+ # does not leave live worker threads blocked on an open queue.
35
+ workers.scale(Karafka::App.config.concurrency)
41
36
 
42
37
  until manager.done?
43
38
  conductor.wait
@@ -56,7 +51,7 @@ module Karafka
56
51
  # with everything. One thing worth keeping in mind though: It is the end user responsibility
57
52
  # to handle the shutdown detection in their long-running processes. Otherwise if timeout
58
53
  # is exceeded, there will be a forced shutdown.
59
- workers.each(&:join)
54
+ workers.join
60
55
  # If anything crashes here, we need to raise the error and crush the runner because it means
61
56
  # that something terrible happened
62
57
  rescue => e
@@ -67,6 +62,11 @@ module Karafka
67
62
  type: "runner.call.error"
68
63
  )
69
64
  Karafka::App.stop!
65
+
66
+ # Clean up workers so we don't leak threads blocked on the queue
67
+ jobs_queue.close
68
+ workers.join
69
+
70
70
  raise e
71
71
  end
72
72
  end
@@ -10,7 +10,8 @@ module Karafka
10
10
  shutdown_timeout: %i[shutdown_timeout],
11
11
  forceful_exit_code: %i[internal forceful_exit_code],
12
12
  forceful_shutdown_wait: %i[internal forceful_shutdown_wait],
13
- process: %i[internal process]
13
+ process: %i[internal process],
14
+ jobs_queue_class: %i[internal processing jobs_queue_class]
14
15
  )
15
16
 
16
17
  class << self
@@ -39,8 +40,7 @@ module Karafka
39
40
 
40
41
  # Method which runs app
41
42
  def run
42
- self.listeners = []
43
- self.workers = []
43
+ prepare
44
44
 
45
45
  # We need to validate this prior to running because it may be executed also from the
46
46
  # embedded
@@ -93,6 +93,7 @@ module Karafka
93
93
  # @note We don't need to sleep because Karafka::Runner is locking and waiting to finish loop
94
94
  # (and it won't happen until we explicitly want to stop)
95
95
  def start
96
+ prepare
96
97
  Karafka::Runner.new.call
97
98
  end
98
99
 
@@ -117,7 +118,7 @@ module Karafka
117
118
  # We divide it by 1000 because we use time in ms.
118
119
  ((timeout / 1_000) * (1 / supervision_sleep)).to_i.times do
119
120
  all_listeners_stopped = listeners.all?(&:stopped?)
120
- all_workers_stopped = workers.none?(&:alive?)
121
+ all_workers_stopped = workers.stopped?
121
122
 
122
123
  return if all_listeners_stopped && all_workers_stopped
123
124
 
@@ -127,7 +128,7 @@ module Karafka
127
128
  raise Errors::ForcefulShutdownError
128
129
  rescue Errors::ForcefulShutdownError => e
129
130
  active_listeners = listeners.select(&:active?)
130
- alive_workers = workers.select(&:alive?)
131
+ alive_workers = workers.alive
131
132
 
132
133
  # Collect details about subscription groups that still have jobs in processing
133
134
  in_processing = jobs_queue ? jobs_queue.in_processing : {}
@@ -143,7 +144,7 @@ module Karafka
143
144
  )
144
145
 
145
146
  # We're done waiting, lets kill them!
146
- workers.each(&:terminate)
147
+ workers.terminate
147
148
  listeners.active.each(&:terminate)
148
149
 
149
150
  # We always need to shutdown clients to make sure we do not force the GC to close consumer.
@@ -186,9 +187,26 @@ module Karafka
186
187
  WaterDrop::ConnectionPool.close
187
188
 
188
189
  Karafka::App.terminate!
190
+
191
+ # Allow prepare to run again if the server is restarted (e.g. reset_status in tests,
192
+ # or embedded re-start).
193
+ @prepared = false
189
194
  end
190
195
  end
191
196
 
197
+ # Initializes listeners, jobs queue and workers pool.
198
+ # Called from both {.run} (standalone) and {.start} (embedded). Guarded so it runs only
199
+ # once even when {.run} delegates to {.start}.
200
+ def prepare
201
+ return if @prepared
202
+
203
+ @prepared = true
204
+
205
+ self.listeners = []
206
+ self.jobs_queue = jobs_queue_class.new
207
+ self.workers = Processing::WorkersPool.new
208
+ end
209
+
192
210
  # Quiets the Karafka server.
193
211
  #
194
212
  # Karafka will stop processing but won't quit the consumer group, so no rebalance will be
@@ -206,5 +224,9 @@ module Karafka
206
224
  self.execution_mode = ExecutionMode.new(:standalone)
207
225
 
208
226
  self.id = SecureRandom.hex(6)
227
+
228
+ # We need to have it set always for cases where it would be references outside of the Karafka
229
+ # process
230
+ self.workers = Processing::WorkersPool.new
209
231
  end
210
232
  end
@@ -125,6 +125,7 @@ module Karafka
125
125
  sasl.oauthbearer.metadata.authentication.type
126
126
  sasl.oauthbearer.method
127
127
  sasl.oauthbearer.scope
128
+ sasl.oauthbearer.sub.claim.name
128
129
  sasl.oauthbearer.token.endpoint.url
129
130
  sasl.password
130
131
  sasl.username
@@ -283,6 +284,7 @@ module Karafka
283
284
  sasl.oauthbearer.metadata.authentication.type
284
285
  sasl.oauthbearer.method
285
286
  sasl.oauthbearer.scope
287
+ sasl.oauthbearer.sub.claim.name
286
288
  sasl.oauthbearer.token.endpoint.url
287
289
  sasl.password
288
290
  sasl.username
@@ -225,6 +225,12 @@ module Karafka
225
225
  setting :activity_manager, default: Routing::ActivityManager.new
226
226
  end
227
227
 
228
+ # Namespace for declarative topics management (infrastructure-as-code)
229
+ setting :declaratives do
230
+ # option builder [Karafka::Declaratives::Builder] builder instance
231
+ setting :builder, default: Declaratives::Builder.new
232
+ end
233
+
228
234
  # Namespace for internal connection related settings
229
235
  setting :connection do
230
236
  # Manages starting up and stopping Kafka connections
@@ -305,24 +311,30 @@ module Karafka
305
311
  setting :jobs_queue_class, default: Processing::JobsQueue
306
312
  # option scheduler [Object] scheduler we will be using
307
313
  setting :scheduler_class, default: Processing::Schedulers::Default
308
- # option jobs_builder [Object] jobs builder we want to use
309
- setting :jobs_builder, default: Processing::JobsBuilder.new
310
- # option coordinator [Class] work coordinator we want to user for processing coordination
311
- setting :coordinator_class, default: Processing::Coordinator
312
- # option errors_tracker_class [Class, nil] errors tracker that is used by the coordinator
313
- # for granular error tracking. `nil` for OSS as it is not in use.
314
- setting :errors_tracker_class, default: nil
315
- # option partitioner_class [Class] partitioner we use against a batch of data
316
- setting :partitioner_class, default: Processing::Partitioner
317
- # option strategy_selector [Object] processing strategy selector to be used
318
- setting :strategy_selector, default: Processing::StrategySelector.new
319
- # option expansions_selector [Object] processing expansions selector to be used
320
- setting :expansions_selector, default: Processing::ExpansionsSelector.new
321
- # option [Class] executor class
322
- setting :executor_class, default: Processing::Executor
323
314
  # option worker_job_call_wrapper [Proc, false] callable object that will be used to wrap
324
315
  # the worker execution of a job or false if no wrapper needed
325
316
  setting :worker_job_call_wrapper, default: false
317
+
318
+ # Consumer-group-specific processing defaults. When share groups land, a parallel
319
+ # `share_groups` namespace will hold their equivalents.
320
+ setting :consumer_groups do
321
+ # option jobs_builder [Object] jobs builder we want to use
322
+ setting :jobs_builder, default: Processing::ConsumerGroups::JobsBuilder.new
323
+ # option coordinator [Class] work coordinator we want to use for processing
324
+ # coordination
325
+ setting :coordinator_class, default: Processing::ConsumerGroups::Coordinator
326
+ # option errors_tracker_class [Class, nil] errors tracker that is used by the
327
+ # coordinator for granular error tracking. `nil` for OSS as it is not in use.
328
+ setting :errors_tracker_class, default: nil
329
+ # option partitioner_class [Class] partitioner we use against a batch of data
330
+ setting :partitioner_class, default: Processing::ConsumerGroups::Partitioner
331
+ # option strategy_selector [Object] processing strategy selector to be used
332
+ setting :strategy_selector, default: Processing::ConsumerGroups::StrategySelector.new
333
+ # option expansions_selector [Object] processing expansions selector to be used
334
+ setting :expansions_selector, default: Processing::ConsumerGroups::ExpansionsSelector.new
335
+ # option [Class] executor class
336
+ setting :executor_class, default: Processing::ConsumerGroups::Executor
337
+ end
326
338
  end
327
339
 
328
340
  # Things related to operating on messages
@@ -428,6 +440,11 @@ module Karafka
428
440
 
429
441
  configure_components(proxy)
430
442
 
443
+ # Install backwards-compatible forwarding so that gems (e.g. karafka-testing) that
444
+ # still access config.internal.processing.strategy_selector (etc.) keep working after
445
+ # the move to config.internal.processing.consumer_groups.*
446
+ install_processing_cg_forwarders(config)
447
+
431
448
  # Refreshes the references that are cached that might have been changed by the config
432
449
  Karafka.refresh!
433
450
 
@@ -446,6 +463,38 @@ module Karafka
446
463
 
447
464
  private
448
465
 
466
+ # Installs forwarding reader methods on the processing config node so that the old
467
+ # (pre-nesting) paths like `config.internal.processing.strategy_selector` still resolve
468
+ # by delegating to `config.internal.processing.consumer_groups.strategy_selector`.
469
+ # This keeps external gems (e.g. karafka-testing) working until they migrate.
470
+ #
471
+ # @param config [Karafka::Core::Configurable::Node] root config node
472
+ def install_processing_cg_forwarders(config)
473
+ processing = config.internal.processing
474
+ cg_node = processing.consumer_groups
475
+
476
+ %i[
477
+ jobs_builder
478
+ coordinator_class
479
+ errors_tracker_class
480
+ partitioner_class
481
+ strategy_selector
482
+ expansions_selector
483
+ executor_class
484
+ ].each do |setting_name|
485
+ writer = :"#{setting_name}="
486
+
487
+ # Remove previous definitions (if setup runs more than once) to avoid
488
+ # "method redefined" warnings that spec_helper promotes to errors
489
+ sc = processing.singleton_class
490
+ sc.remove_method(setting_name) if processing.respond_to?(setting_name)
491
+ sc.remove_method(writer) if processing.respond_to?(writer)
492
+
493
+ processing.define_singleton_method(setting_name) { cg_node.public_send(setting_name) }
494
+ processing.define_singleton_method(writer) { |val| cg_node.public_send(writer, val) }
495
+ end
496
+ end
497
+
449
498
  # Sets up all the components that are based on the user configuration
450
499
  # @param config_proxy [ConfigProxy] the configuration proxy containing deferred setup
451
500
  # blocks
@@ -45,8 +45,7 @@ module Karafka
45
45
  # Without the proxy, we'd have two problems:
46
46
  #
47
47
  # 1. **Permanent API pollution**: Adding a `producer` method to config that accepts blocks
48
- # would change its permanent API, even though this functionality is only needed during
49
- # setup.
48
+ # would change its permanent API, even though this functionality is only needed during setup.
50
49
  #
51
50
  # 2. **Timing issues**: The producer doesn't exist yet when the user's setup block runs.
52
51
  # The producer is created in `configure_components` after all user configuration is
@@ -8,7 +8,7 @@ module Karafka
8
8
  #
9
9
  # @note There are many more configuration options inside of the
10
10
  # `Karafka::Setup::Config` model, but we don't validate them here as they are
11
- # validated per each route (topic + consumer_group) because they can be overwritten,
11
+ # validated per each route (topic + group) because they can be overwritten,
12
12
  # so we validate all of that once all the routes are defined and ready.
13
13
  class Config < Karafka::Contracts::Base
14
14
  configure do |config|
@@ -121,16 +121,19 @@ module Karafka
121
121
  end
122
122
 
123
123
  nested(:processing) do
124
- required(:jobs_builder) { |val| !val.nil? }
125
124
  required(:jobs_queue_class) { |val| !val.nil? }
126
125
  required(:scheduler_class) { |val| !val.nil? }
127
- required(:coordinator_class) { |val| !val.nil? }
128
- required(:errors_tracker_class) { |val| val.nil? || val.is_a?(Class) }
129
- required(:partitioner_class) { |val| !val.nil? }
130
- required(:strategy_selector) { |val| !val.nil? }
131
- required(:expansions_selector) { |val| !val.nil? }
132
- required(:executor_class) { |val| !val.nil? }
133
126
  required(:worker_job_call_wrapper) { |val| val == false || val.respond_to?(:wrap) }
127
+
128
+ nested(:consumer_groups) do
129
+ required(:jobs_builder) { |val| !val.nil? }
130
+ required(:coordinator_class) { |val| !val.nil? }
131
+ required(:errors_tracker_class) { |val| val.nil? || val.is_a?(Class) }
132
+ required(:partitioner_class) { |val| !val.nil? }
133
+ required(:strategy_selector) { |val| !val.nil? }
134
+ required(:expansions_selector) { |val| !val.nil? }
135
+ required(:executor_class) { |val| !val.nil? }
136
+ end
134
137
  end
135
138
 
136
139
  nested(:active_job) do
@@ -170,6 +173,23 @@ module Karafka
170
173
  detected_errors
171
174
  end
172
175
 
176
+ # Certain kafka settings are managed internally by Karafka and should not be set
177
+ # directly. Setting them manually may cause misbehaviours and other unexpected issues.
178
+ virtual do |data, errors|
179
+ next unless errors.empty?
180
+
181
+ managed_keys = Karafka::Setup::DefaultsInjector.managed_keys
182
+ detected_errors = []
183
+
184
+ data.fetch(:kafka).each_key do |key|
185
+ next unless managed_keys.include?(key)
186
+
187
+ detected_errors << [[:kafka, key], :managed_key_not_supported]
188
+ end
189
+
190
+ detected_errors
191
+ end
192
+
173
193
  virtual do |data, errors|
174
194
  next unless errors.empty?
175
195
 
@@ -52,6 +52,16 @@ module Karafka
52
52
  )
53
53
 
54
54
  class << self
55
+ # Kafka settings that are managed internally by Karafka and should not be set directly
56
+ # by users. Setting them manually may cause misbehaviours and other unexpected issues.
57
+ #
58
+ # @return [Set<Symbol>] set of managed kafka setting keys
59
+ def managed_keys
60
+ @managed_keys ||= Set[
61
+ :"statistics.unassigned.include"
62
+ ]
63
+ end
64
+
55
65
  # Propagates the kafka setting defaults unless they are already present for consumer config
56
66
  # This makes it easier to set some values that users usually don't change but still allows
57
67
  # them to overwrite the whole hash if they want to
@@ -41,8 +41,7 @@ module Karafka
41
41
  @status.to_s
42
42
  end
43
43
 
44
- # Resets the status state
45
- # This is used mostly in the integration suite
44
+ # Resets the status state This is used mostly in the integration suite
46
45
  def reset!
47
46
  @status = :initializing
48
47
  end
@@ -19,6 +19,13 @@ module Karafka
19
19
  @mutex = Mutex.new
20
20
  end
21
21
 
22
+ # Report liveness before the first fetch loop iteration so the supervisor gets an initial
23
+ # healthy report even if the first consumption takes longer than the report timeout.
24
+ # @param _event [Karafka::Core::Monitoring::Event]
25
+ def on_connection_listener_before_fetch_loop(_event)
26
+ report_liveness
27
+ end
28
+
22
29
  # Report from the fetch loop at the top of each iteration
23
30
  # @param _event [Karafka::Core::Monitoring::Event]
24
31
  def on_connection_listener_fetch_loop(_event)
@@ -19,12 +19,12 @@ module Karafka
19
19
  node_restart_timeout: %i[internal swarm node_restart_timeout]
20
20
  )
21
21
 
22
- # Status we issue when we decide to shutdown unresponsive node
22
+ # Status we issue when we decide to shutdown a non-reporting node
23
23
  # We use -1 because nodes are expected to report 0+ statuses and we can use negative numbers
24
24
  # for non-node based statuses
25
- NOT_RESPONDING_SHUTDOWN_STATUS = -1
25
+ NOT_REPORTING_SHUTDOWN_STATUS = -1
26
26
 
27
- private_constant :NOT_RESPONDING_SHUTDOWN_STATUS
27
+ private_constant :NOT_REPORTING_SHUTDOWN_STATUS
28
28
 
29
29
  # @return [Array<Node>] All nodes that manager manages
30
30
  attr_reader :nodes
@@ -84,7 +84,7 @@ module Karafka
84
84
  if node.alive?
85
85
  next if terminate_if_hanging(statuses, node)
86
86
  next if stop_if_not_healthy(statuses, node)
87
- next if stop_if_not_responding(statuses, node)
87
+ next if stop_if_not_reporting(statuses, node)
88
88
  else
89
89
  next if cleanup_one(statuses, node)
90
90
  next if restart_after_timeout(statuses, node)
@@ -144,12 +144,12 @@ module Karafka
144
144
  end
145
145
  end
146
146
 
147
- # If node stopped responding, starts the stopping procedure.
147
+ # If node stopped reporting, starts the stopping procedure.
148
148
  #
149
149
  # @param statuses [Hash] hash with statuses transitions with times
150
150
  # @param node [Swarm::Node] node we're checking
151
151
  # @return [Boolean] should it be the last action taken on this node in this run
152
- def stop_if_not_responding(statuses, node)
152
+ def stop_if_not_reporting(statuses, node)
153
153
  # Do nothing if already stopping
154
154
  return true if statuses.key?(:stop)
155
155
  # Do nothing if we've received status update recently enough
@@ -160,7 +160,7 @@ module Karafka
160
160
  "swarm.manager.stopping",
161
161
  caller: self,
162
162
  node: node,
163
- status: NOT_RESPONDING_SHUTDOWN_STATUS
163
+ status: NOT_REPORTING_SHUTDOWN_STATUS
164
164
  ) do
165
165
  node.stop
166
166
  statuses[:stop] = monotonic_now
@@ -45,6 +45,14 @@ module Karafka
45
45
  # - recreates producer and web producer
46
46
  # @note Parent API
47
47
  def start
48
+ # Close the previous reader pipe if it exists to prevent FD leaks on node restarts.
49
+ # Without this, each restart orphans the old reader pipe in the supervisor, and forked
50
+ # children inherit all accumulated leaked FDs.
51
+ begin
52
+ @reader&.close
53
+ rescue IOError
54
+ nil
55
+ end
48
56
  @reader, @writer = IO.pipe
49
57
  # Reset alive status when starting/restarting a node
50
58
  # nil means unknown status - will check with waitpid
@@ -30,7 +30,15 @@ module Karafka
30
30
  # to reach out nodes and be processed to start the shutdown flow. Because of that and
31
31
  # because we always want to give all nodes all the time of `shutdown_timeout` they are
32
32
  # expected to have, we add this just to compensate.
33
- SHUTDOWN_GRACE_PERIOD = 1_000
33
+ #
34
+ # Beyond signal propagation, child nodes also need a window after their own graceful
35
+ # `shutdown_timeout` to actually exit the process (run `at_exit` handlers, finalize
36
+ # librdkafka handles, close pools, etc.). On CI (especially macOS) the effective loop
37
+ # duration is noticeably longer than the nominal budget because `sleep` granularity and
38
+ # the per-iteration `waitpid` cost stretch each 0.1s tick. A too-tight grace period
39
+ # causes the supervisor to raise `ForcefulShutdownError` while a node is still in its
40
+ # final cleanup phase, which manifests as flaky shutdowns in swarm integration tests.
41
+ SHUTDOWN_GRACE_PERIOD = 15_000
34
42
 
35
43
  private_constant :SHUTDOWN_GRACE_PERIOD
36
44
 
@@ -94,14 +94,20 @@ class KarafkaApp < Karafka::App
94
94
  # active_job_topic :default
95
95
  <% end -%>
96
96
  topic :example do
97
- # Uncomment this if you want Karafka to manage your topics configuration
98
- # Managing topics configuration via routing will allow you to ensure config consistency
99
- # across multiple environments
100
- #
101
- # config(partitions: 2, 'cleanup.policy': 'compact')
102
97
  consumer ExampleConsumer
103
98
  end
104
99
  end
100
+
101
+ # Uncomment this if you want Karafka to manage your topics configuration
102
+ # Declarative topics allow you to ensure topic config consistency across multiple environments
103
+ #
104
+ # declaratives.draw do
105
+ # topic :example do
106
+ # partitions 2
107
+ # replication_factor 1
108
+ # config 'cleanup.policy': 'compact'
109
+ # end
110
+ # end
105
111
  end
106
112
 
107
113
  # Karafka now features a Web UI!
@@ -3,5 +3,5 @@
3
3
  # Main module namespace
4
4
  module Karafka
5
5
  # Current Karafka version
6
- VERSION = "2.5.9"
6
+ VERSION = "2.6.0.beta1"
7
7
  end