国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang—kafka架構(gòu)原理快速入門以及自測環(huán)境搭建(docker單節(jié)點部署)

這篇具有很好參考價值的文章主要介紹了golang—kafka架構(gòu)原理快速入門以及自測環(huán)境搭建(docker單節(jié)點部署)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

kafka

Apache Kafka 是一個分布式的流處理平臺。它具有以下特點:

  • 支持消息的發(fā)布和訂閱,類似于 RabbtMQ、ActiveMQ 等消息隊列
  • 支持?jǐn)?shù)據(jù)實時處理
  • 能保證消息的可靠性投遞
  • 支持消息的持久化存儲,并通過多副本分布式的存儲方案來保證消息的容錯
  • 高吞吐率,單 Broker 可以輕松處理數(shù)千個分區(qū)以及每秒百萬級的消息量

架構(gòu)簡介

golang—kafka架構(gòu)原理快速入門以及自測環(huán)境搭建(docker單節(jié)點部署),golang,kafka,架構(gòu)

Messages and Batches

kafka基本數(shù)據(jù)單元為消息,為了提高網(wǎng)絡(luò)使用效率,采用批寫入方式

Topics and Partitions

topic為kafka消費(fèi)主題,每個主題下有若干分區(qū)(partitions),Kafka 通過分區(qū)來實現(xiàn)數(shù)據(jù)的冗余和伸縮性,分區(qū)可以分布在不同的服務(wù)器上。由于多個partition的特性,kafka無法保證topic范圍內(nèi)的消息順序,但是可以保證單個分區(qū)內(nèi)消息的順序

broker

broker 對應(yīng)著一個 kafka 的進(jìn)程;一個 kafka 集群會包含多個 broker;同時需要在這些 broker中選舉出一個controller,選舉是通過 zk 來實現(xiàn);controller 負(fù)責(zé)協(xié)調(diào)管理集群狀態(tài),同時也負(fù)責(zé) partition 的 leader 選舉;

Producers And Consumers
  • 消息的生產(chǎn)者,負(fù)責(zé)將消息發(fā)送到不同的 partition 中;消息的生產(chǎn)需要考慮冪等性、正確性以及安全性;kafka 引入了 ack 機(jī)制;ack 為 0,則不需要 kafka 回復(fù),此時可能造成數(shù)據(jù)丟失;ack為 1, 則需要等待 leader 回復(fù),此時其他 replica 可能還沒同步 leader 掛掉,數(shù)據(jù)安全性沒法得到保證;ack 為 -1,則需要等待其他 replica 同步完成后,才回復(fù),此時數(shù)據(jù)最健壯,但是效率最低;
  • 消息的消費(fèi)者,負(fù)責(zé)消費(fèi)消息;一個 partition 對應(yīng)一個consumer, 而一個 consumer 可以對應(yīng)多個 partition;消費(fèi)同一類消息的高吞吐量,可以設(shè)置 consumer group;
副本同步策略

每個分區(qū)里有多個副本,這些副本有一個leader。只有副本全部同步完成才發(fā)送ack。這里指同步策略,是全量同步,而不是半數(shù)以上同步了就認(rèn)為該數(shù)據(jù)已經(jīng)commit。不過也可以設(shè)置最少同步副本數(shù)提高性能(min.insync.replicas)

ISR

Leader 維護(hù)了一個動態(tài)的 in-sync replica set (ISR),意為和 leader 保持同步的 follower 集合。當(dāng) ISR 中的 follower 完成數(shù)據(jù)的同步之后,leader 就會給 producer 發(fā)送 ack。如果 follower 長時間未向 leader 同步數(shù)據(jù),則該 follower 將被踢出 ISR,該時間閾值由 replica.lag.time.max.ms 參數(shù)設(shè)定。Leader 發(fā)生故障之后,就會從 ISR 中選舉新的 leader。

數(shù)據(jù)可見性

需要注意的是,并不是所有保存在分區(qū)首領(lǐng)上的數(shù)據(jù)都可以被客戶端讀取到,為了保證數(shù)據(jù)一致性,只有被所有同步副本 (ISR 中所有副本) 都保存了的數(shù)據(jù)才能被客戶端讀取到。
golang—kafka架構(gòu)原理快速入門以及自測環(huán)境搭建(docker單節(jié)點部署),golang,kafka,架構(gòu)

kafka讀寫機(jī)制

producer寫流程

producer寫入消息流程如下:

  • 連接ZK集群,從ZK中拿到對應(yīng)topic的partition信息和partition的Leader的相關(guān)信息

  • 連接到對應(yīng)Leader對應(yīng)的broker

  • 將消息按批次發(fā)送到partition的Leader上

  • 其他Follower從Leader上復(fù)制數(shù)據(jù)

  • 依次返回ACK

  • 直到所有ISR中的數(shù)據(jù)寫完成,才完成提交,整個寫過程結(jié)束
    golang—kafka架構(gòu)原理快速入門以及自測環(huán)境搭建(docker單節(jié)點部署),golang,kafka,架構(gòu)

consumer 讀流程
  • 連接ZK集群,從ZK中拿到對應(yīng)topic的partition信息和partition的Leader的相關(guān)信息

  • 連接到對應(yīng)Leader對應(yīng)的broker

  • consumer將自己保存的offset發(fā)送給Leader

  • Leader根據(jù)offset等信息定位到segment(索引文件和日志文件)

  • 根據(jù)索引文件中的內(nèi)容,定位到日志文件中該偏移量對應(yīng)的開始位置讀取相應(yīng)長度的數(shù)據(jù)并返回給consumer

kafka集群選舉

副本leader選舉

只有完全追上Leader數(shù)據(jù)的follower才能進(jìn)行選舉,Leader發(fā)生故障之后,會從ISR中選出一個新的Leader

controller選舉

這部分由ZK完成,不過高本版kafka引入kratf,就可以完成去ZK化了。 ratf是一種簡單易理解并且嚴(yán)格復(fù)合數(shù)學(xué)歸納的共識算法。

自測環(huán)境搭建

zk

docker pull wurstmeister/zookeeper
docker run -itd --name zookeeper -p 2181:2181 wurstmeister/zookeeper

kafka

 docker pull wurstmeister/kafka
 docker run -itd --name kafka -p 9092:9092 -e HOST_IP=10.74.18.61 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_ADVERTISED_HOST_NAME=10.74.18.61 --link zookeeper:zookeeper wurstmeister/kafka

go鏈接kafka生產(chǎn)消費(fèi)

go版本:1.21
生產(chǎn)者

package main

import (
	"fmt"

	"github.com/IBM/sarama"
)

func main() {
	config := sarama.NewConfig()
	// 等待服務(wù)器所有副本都保存成功后的響應(yīng),對應(yīng)ack=-1
	config.Producer.RequiredAcks = sarama.WaitForAll
	// 隨機(jī)的分區(qū)類型:返回一個分區(qū)器,該分區(qū)器每次選擇一個隨機(jī)分區(qū)
	config.Producer.Partitioner = sarama.NewRandomPartitioner
	// 是否等待成功和失敗后的響應(yīng)
	config.Producer.Return.Successes = true

	// 使用給定代理地址和配置創(chuàng)建一個同步生產(chǎn)者
	producer, err := sarama.NewSyncProducer([]string{"10.74.18.61:9092"}, config)
	if err != nil {
		panic(err)
	}

	defer producer.Close()

	//構(gòu)建發(fā)送的消息,
	msg := &sarama.ProducerMessage{
		//Topic: "test",//包含了消息的主題
		Partition: int32(10),                   //
		Key:       sarama.StringEncoder("key"), //
	}

	var value string
	var msgType string
	for {
		_, err := fmt.Scanf("%s", &value)
		if err != nil {
			break
		}
		fmt.Scanf("%s", &msgType)
		fmt.Println("msgType = ", msgType, ",value = ", value)
		msg.Topic = msgType
		//將字符串轉(zhuǎn)換為字節(jié)數(shù)組
		msg.Value = sarama.ByteEncoder(value)
		//fmt.Println(value)
		//SendMessage:該方法是生產(chǎn)者生產(chǎn)給定的消息
		//生產(chǎn)成功的時候返回該消息的分區(qū)和所在的偏移量
		//生產(chǎn)失敗的時候返回error
		partition, offset, err := producer.SendMessage(msg)

		if err != nil {
			fmt.Println("Send message Fail", err)
		}
		fmt.Printf("Partition = %d, offset=%d\n", partition, offset)
	}
}

消費(fèi)者文章來源地址http://www.zghlxwxcb.cn/news/detail-766945.html

package main

import (
	"fmt"
	"sync"

	"github.com/IBM/sarama"
)

var (
	wg sync.WaitGroup
)

func main() {
	// 根據(jù)給定的代理地址和配置創(chuàng)建一個消費(fèi)者
	consumer, err := sarama.NewConsumer([]string{"10.74.18.61:9092"}, nil)
	if err != nil {
		panic(err)
	}
	//Partitions(topic):該方法返回了該topic的所有分區(qū)id
	partitionList, err := consumer.Partitions("test")
	if err != nil {
		panic(err)
	}

	for partition := range partitionList {
		//ConsumePartition方法根據(jù)主題,分區(qū)和給定的偏移量創(chuàng)建創(chuàng)建了相應(yīng)的分區(qū)消費(fèi)者
		//如果該分區(qū)消費(fèi)者已經(jīng)消費(fèi)了該信息將會返回error
		//sarama.OffsetNewest:表明了為最新消息
		pc, err := consumer.ConsumePartition("test", int32(partition), sarama.OffsetNewest)
		if err != nil {
			panic(err)
		}
		defer pc.AsyncClose()
		wg.Add(1)
		go func(sarama.PartitionConsumer) {
			defer wg.Done()
			//Messages()該方法返回一個消費(fèi)消息類型的只讀通道,由代理產(chǎn)生
			for msg := range pc.Messages() {
				fmt.Printf("%s---Partition:%d, Offset:%d, Key:%s, Value:%s\n", msg.Topic, msg.Partition, msg.Offset, string(msg.Key), string(msg.Value))
			}
		}(pc)
	}
	wg.Wait()
	consumer.Close()
}

到了這里,關(guān)于golang—kafka架構(gòu)原理快速入門以及自測環(huán)境搭建(docker單節(jié)點部署)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【大唐杯學(xué)習(xí)超快速入門】5G技術(shù)原理仿真教學(xué)——5G網(wǎng)絡(luò)架構(gòu)演進(jìn)

    【大唐杯學(xué)習(xí)超快速入門】5G技術(shù)原理仿真教學(xué)——5G網(wǎng)絡(luò)架構(gòu)演進(jìn)

    2,3G未寫 需要記下各個網(wǎng)元的位置,以及各個網(wǎng)元間接口。 與e-nodeB之間接入的是MME與S-GW MME還會與HSS連接 SGW P-GW IP sever都與PCRF連接,構(gòu)成一個三角 接入網(wǎng): E-UTRAN(Evolved UMTS Terrestrial Radio Access Network):演進(jìn)的UMTS陸地?zé)o線接入網(wǎng) eNodeB(Evolved Node B):演進(jìn)型Node B ,簡稱e

    2024年02月08日
    瀏覽(29)
  • 【大唐杯學(xué)習(xí)超快速入門】5G技術(shù)原理仿真教學(xué)——5G網(wǎng)絡(luò)協(xié)議架構(gòu)

    【大唐杯學(xué)習(xí)超快速入門】5G技術(shù)原理仿真教學(xué)——5G網(wǎng)絡(luò)協(xié)議架構(gòu)

    這一部分主要考察了從ue到gnb的DU與CU再到核心網(wǎng),從用戶面到控制面,各部分的接口,以及協(xié)議棧。首先要記住各個協(xié)議的內(nèi)涵,使用在哪里,然后要記住協(xié)議棧。在做題的時候?qū)?yīng)位置同一層的協(xié)議必定是相同的。 學(xué)習(xí)參考如下鏈接 5G架構(gòu)和協(xié)議棧 5GNR協(xié)議棧 5G空口協(xié)議棧

    2024年02月11日
    瀏覽(27)
  • 【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構(gòu)分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK

    【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構(gòu)分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK

    前提背景 大家都知道,市面上有許多開源的MQ,例如,RocketMQ、Kafka、RabbitMQ等等,現(xiàn)在Pulsar也開始發(fā)光,今天我們談?wù)劰P者最常用的RocketMQ和Kafka,想必大家早就知道二者之間的特點以及區(qū)別,但是在實際場景中,二者的選取有可能會范迷惑,那么今天筆者就帶領(lǐng)大家分析一下

    2024年02月19日
    瀏覽(26)
  • 【Linux系統(tǒng)基礎(chǔ)快速入門詳解】Linux核心find命令原理詳解和每個命令使用場景以及實例

    【Linux系統(tǒng)基礎(chǔ)快速入門詳解】Linux核心find命令原理詳解和每個命令使用場景以及實例

    魚弦:CSDN內(nèi)容合伙人、CSDN新星導(dǎo)師、51CTO(Top紅人+專家博主) 、github開源愛好者(go-zero源碼二次開發(fā)、游戲后端架構(gòu) https://github.com/Peakchen) find 命令是在 Linux 操作系統(tǒng)中用于搜索文件和目錄的命令行工具。它可以根據(jù)不同的條件來搜索特定的文件和目錄,這些條件可以是文

    2024年02月07日
    瀏覽(22)
  • Golang學(xué)習(xí)筆記_RabbitMQ的原理架構(gòu)和使用

    實現(xiàn)了高級消息隊列協(xié)議(Advanced Message Queuing Protcol)AMQP 消息隊列中間件的作用(Redis實現(xiàn)MQ里面有寫過,這里簡單帶過) 解耦 削峰 異步處理 緩存 消息通信 提高擴(kuò)展性 RabbitMQ 架構(gòu)理解 binding(綁定):交換機(jī)將消息路由給Queue所遵循的規(guī)則,可以定義一個路由鍵,用于交換機(jī)

    2024年04月24日
    瀏覽(19)
  • Golang快速入門到實踐學(xué)習(xí)筆記

    Golang快速入門到實踐學(xué)習(xí)筆記

    Go程序設(shè)計的一些規(guī)則 Go之所以會那么簡潔,是因為它有一些默認(rèn)的行為: 大寫字母開頭的變量是可導(dǎo)出的,也就是其它包可以讀取 的,是公用變量;小寫字母開頭的就是不可導(dǎo)出的,是私有變量。 大寫字母開頭的函數(shù)也是一樣,相當(dāng)于class 中的帶public的公有函數(shù);

    2024年02月20日
    瀏覽(17)
  • AWS Lambda Golang HelloWorld 快速入門

    AWS Lambda Golang HelloWorld 快速入門

    以下測試基于 WSL2 Ubuntu 22.04 環(huán)境 來到 Lambda 控制臺, 創(chuàng)建新的函數(shù), Runtime 選擇 Go 1.x Code Upload from .zip file 選擇前面編譯并打包的 main.zip 文件上傳. 隨后創(chuàng)建新的 Test 匹配 Lambda 處理的 Event 數(shù)據(jù)格式: Test, 歐耶~報錯了! 返回 Code 標(biāo)簽頁, 看到默認(rèn)的 Handler 設(shè)置的是 hello , 這和我們

    2024年02月07日
    瀏覽(20)
  • Mac golang下載安裝以及環(huán)境變量配置

    Mac golang下載安裝以及環(huán)境變量配置

    下載地址: All releases - The Go Programming Language

    2024年02月19日
    瀏覽(35)
  • kafka架構(gòu)和原理詳解

    kafka架構(gòu)和原理詳解

    Apache Kafka 是一個分布式流數(shù)據(jù)平臺,用于高吞吐量、持久性、可擴(kuò)展的發(fā)布和訂閱消息。它具有高度的可靠性,被廣泛用于構(gòu)建實時數(shù)據(jù)流處理、日志收集和數(shù)據(jù)管道等應(yīng)用。 1. 主題(Topic): 主題是消息的邏輯分類 生產(chǎn)者將消息發(fā)布到特定的主題中,而消費(fèi)者可以訂閱一

    2024年02月10日
    瀏覽(28)
  • kafka原理&架構(gòu)深入

    kafka原理&架構(gòu)深入

    https://www.cnblogs.com/zhangzhonghui/articles/12444070.html kafka配置詳解 若kafka運(yùn)行在內(nèi)網(wǎng)服務(wù)器允許外網(wǎng)訪問,例如內(nèi)網(wǎng)ip: 172.10.22.134,外網(wǎng)ip: 9.70.168.130 進(jìn)行如下配置: 外網(wǎng)訪問時使用 9.70.168.130:9092 訪問即可 cd kafka安裝目錄 后臺啟動 停止 topic producer 查看 consumer-groups 開啟consumer消費(fèi)某

    2024年02月11日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包