BSD-3-Clause licensed by NoRedInk
Maintained by [email protected]
This version can be pinned in stack with:nri-kafka-0.1.0.4@sha256:d2cacc37c46b03adc7dfb2d942a6b1b6fb6973c86a0a1ddf958d270611bdb4e7,4128

Module documentation for 0.1.0.4

Kafka integration

Reviewed last on 2021-05-28

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