# WaterDrop [![Build Status](https://github.com/karafka/waterdrop/workflows/ci/badge.svg)](https://github.com/karafka/waterdrop/actions?query=workflow%3Aci) [![Gem Version](https://badge.fury.io/rb/waterdrop.svg)](http://badge.fury.io/rb/waterdrop) [![Join the chat at https://slack.karafka.io](https://raw.githubusercontent.com/karafka/misc/master/slack.svg)](https://slack.karafka.io) WaterDrop is a standalone gem that sends messages to Kafka easily with an extra validation layer. It is a part of the [Karafka](https://github.com/karafka/karafka) ecosystem. It: - Is thread-safe - Supports sync producing - Supports async producing - Supports transactions - Supports buffering - Supports producing messages to multiple clusters - Supports multiple delivery policies - Works with Kafka `1.0+` and Ruby `2.7+` - Works with and without Karafka ## Documentation Karafka ecosystem components documentation, including WaterDrop, can be found [here](https://karafka.io/docs/#waterdrop). ## Getting Started If you want to both produce and consume messages, please use [Karafka](https://github.com/karafka/karafka/). It integrates WaterDrop automatically. To get started with WaterDrop: 1. Add it to your Gemfile: ```bash bundle add waterdrop ``` 2. Create and configure a producer: ```ruby producer = WaterDrop::Producer.new do |config| config.deliver = true config.kafka = { 'bootstrap.servers': 'localhost:9092', 'request.required.acks': 1 } end ``` 3. Use it as follows: ```ruby # sync producing producer.produce_sync(topic: 'my-topic', payload: 'my message') # or for async producer.produce_async(topic: 'my-topic', payload: 'my message') # or in sync batches producer.produce_many_sync( [ { topic: 'my-topic', payload: 'my message'}, { topic: 'my-topic', payload: 'my message'} ] ) # and async batches producer.produce_many_async( [ { topic: 'my-topic', payload: 'my message'}, { topic: 'my-topic', payload: 'my message'} ] ) # transactions producer.transaction do producer.produce_async(topic: 'my-topic', payload: 'my message') producer.produce_async(topic: 'my-topic', payload: 'my message') end ```