iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Modern Web

『卡夫卡的藏書閣』- 程序猿必須懂的Kafka開發與實作系列 第 15

卡夫卡的藏書閣【Book15】- KafkaJS 生產者 - 參數設定 3

“I have the true feeling of myself only when I am unbearably unhappy.”
― Franz Kafka
躁鬱症就在你我身邊


生產者的方法 send 有多個參數可以帶入

await producer.send({
    topic: <String>,
    messages: <Message[]>,
    acks: <Number>,
    timeout: <Number>,
    compression: <CompressionTypes>,
})
  • topic: 主題名稱
    • 預設值:null
  • messages: 物件的陣列
    • 物件內容可以包含:
      • key
      • value
      • partition
      • timestamp
      • headers
    • 範例: [{ key: 'my-key', value: 'my-value'}]
    • 預設值:null
  • acks
    • -1 = 預設值,也就是 all,必須要所有的副本都回報有收到訊息後,生產者才算是從代理 ( broker ) 收到傳送成功的訊息,如果資料是極度重要、不可遺失,可以選擇此模式
    • 0 = 不需要任何代理回報有收到,就認定傳送成功,如果有分區壞掉沒收到,生產者也不會知道,是速度最快的模式
    • 1 = 只要分區領袖 ( partition leader ) 有回報收到,就算訊息傳送成功,但仍然有可能遺失資料,當原本的 partition leader 掛掉,而新的 partition leader 也沒有這筆資料時,資料就遺失了
      • 預設值:-1
  • timeout: 等待回應時間(毫秒)
    • 預設值:30000
  • compression: 編碼解碼器 ( Compression codec )
    • 預設值:CompressionTypes.None

生產者預設會用以下三種邏輯去決定要將訊息傳送到哪個分區:

  1. 如果生產者有指定分區 ( partition ),那就會傳送訊息到那個分區
  2. 如果生產者沒有指定分區 ( partition ) ,但是有訊息有帶入 key 參數,那會使用 murmur2 hash 出來的值去決定分配到哪個分區
  3. 如果生產者沒有指定分區,也沒有帶入 key 參數,那就會按照每個分區輪流發送訊息 ( round-robin fashion )

訊息的標頭

Kafka 版本 0.11 之後有支援訊息加上標頭 ( headers ),讓你可以加上更多的資訊, 標頭是可以存放多個 key-value 的物件

await producer.send({
    topic: 'topic-name',
    messages: [{
        key: 'key1',
        value: 'hello world',
        headers: {
            'correlation-id': '2bfb68bb-893a-423b-a7fa-7b568cad5b67',
            'system-id': 'my-system'
        }
    }]
})


上一篇
卡夫卡的藏書閣【Book14】- KafkaJS 生產者 - 壓縮 2
下一篇
卡夫卡的藏書閣【Book16】- Kafka - KafkaJS 生產者 - 4
系列文
『卡夫卡的藏書閣』- 程序猿必須懂的Kafka開發與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言