This library exposes an Elm-like API to Kafka. It exports two main modules:
Kafka, for writing to Kafka.
Kafka.Worker, For building long-running worker apps that process Haskell
messages.
At NoRedInk, we use this to power our high-throughput quiz-engine service. If
you work at NoRedInk: look there for a simple example app.
Otherwise: here’s the gist of it:
import qualified Environment -- from nri-env-parser
import qualified Kafka.Worker
-- your long running app
main :: IO ()
main =
settings <- Environment.decode Kafka.Worker.decoder
Kafka.Worker.process
Kafka.Worker.Description
settings
"this worker's group id"
(Kafka.Worker.subscription "my.topic" processMessage,)
data MyKafkaMessageType =
ReticulateSplines Int
AddHiddenAgenda Text
CalculateLlamaExpectorationTrajectory Llamas
deriving (generic)
instance Aeson.ToJSON Envelope
instance Aeson.FromJSON Envelope
-- the meat and potatoes: handles all MyKafkaMessageTypes
processMessage ::
Kafka.Worker.Envelope MyKafkaMessageType ->
Task Text ()
processMessage record myMessage =
-- process your message in here
-- because of our usage of `Task` you probably want to pass in any handlers
case myMessage of
AddHiddenAgenda agenda ->
Debug.todo "Add the agenda"
_ ->
Debug.todo "and also handle the other cases"
Changes
0.1.0.4
Added new ElsewhereButToKafkaAsWell mode to CommitOffsets, which commits offsets to Kafka once the external Offset storage has been updated. Kafka commits are performed only to keep Kafka informed about consumer lag.
0.1.0.3
Relax version bounds to encompass text-2.0.x, base-4.16.x and template-haskell-2.18.x
0.1.0.2
Support time-1.x.
0.1.0.1
Support aeson-2.0.x.
0.1.0.0
First release, but we’ve battle-tested it against significant load for months now!
Hope you enjoy