第 3 講:KAFKA生產者(Producer)詳解

這是一篇既照顧入門也能給高級工程師提供落地經驗的實戰筆記。

0. TL;DR(先上結論)

  • 想穩:acks=all + 合理 retries;需要“分區內不重不丟”→ 再加 enable.idempotence=truemax.in.flight<=5
  • 想快:適度增大 batch.sizelinger.ms,開啟 compression=zstd,若可丟用 acks=0
  • 想一致:跨分區/主題要“要么全成要么全不成”→ 用事務(transactional.id),消費端 read_committed
  • 不確定怎么配?先跑 Demo 看數據:lesson_three/web_demo 頁面支持一鍵預設、分區直方圖、吞吐歷史。

讀者畫像

  • 初學者:只需看“工作流程概覽”“QoS 選型”“10 分鐘上手”,再跑 Web Demo。
  • 高級工程師:關注“參數建議表”“常見坑”“生產就緒清單”“實戰案例”“調優路線”。

你將收獲

  • 對 acks/冪等/事務/批量/壓縮的“白話”理解,知道各自代價與邊界。
  • 一套可直接投產的默認配置與檢查清單。
  • 可視化 Demo:改參數→立刻看到吞吐、分區分布、樣本偏移。

0.5 10 分鐘上手路線

  1. 啟動本地 Kafka,或將 KAFKA_BOOTSTRAP 指到你的集群。
  2. 運行 Web Demo:
uvicorn lesson_three.web_demo.main:app --reload
  1. 瀏覽器打開 http://127.0.0.1:8000
    • 點頂部卡片一鍵預設(吞吐/可靠/同 key 同分區)
    • 看右側:JSON 結果、分區直方圖、吞吐歷史

通過 Demo 先把“感覺”建立起來,再回到本文查概念與參數細節。

1. 工作流程概覽

  1. 攔截器(可選) → 統一埋點/改寫消息
  2. 序列化器 → key/value 轉字節
  3. 分區器 → 選擇分區(同 key 同分區;無 key 用粘性分區器優化批量)
  4. 累加器 RecordAccumulator → 組成批(batch.size / linger.ms / flush() 觸發)
  5. Sender 線程 → 取批、發往分區 leader
  6. Broker → 寫 leader 日志;按 acks 等待副本
  7. 回調/Future → 成功或異常

Producer 默認異步send() 立即返回 Future;同步語義通常是對 Future get() 或使用回調。


2. ACK 機制(acks

  • acks=0:不等響應,最快,可能丟。
  • acks=1:leader 寫入就回,leader 掉線時可能丟
  • acks=all/-1:等 ISR 最小副本集合確認,最強持久性

冪等/事務要求 acks=all

小貼士(為啥):

  • acks=0 不等任何確認,延遲最低但可能丟;適合可丟日志。
  • acks=1 等 leader,leader 掛時可能丟;適合對“極偶發丟失”容忍的業務。
  • acks=all 等同步副本,可靠但更慢;配合冪等/事務才能保證語義。

3. 批量、壓縮、異步

  • 批量batch.size(單分區批字節上限)、linger.ms(積攢時延)。常用:batch.size=32–128KBlinger.ms=5–20ms
  • 壓縮compression.type=zstd|lz4|snappy|gzip(推薦 zstd)。
  • 異步:默認異步;需要“業務確認” → 回調或 flush()/get()

怎么配(經驗法則):

  • 低延遲接口:linger.ms<=5batch.size 32–64KB。
  • 高吞吐埋點:linger.ms=10–20batch.size=64–128KBcompression=zstd
  • 網絡吃緊:優先開壓縮;CPU 緊張則降級 gzip/none

4. 冪等性生產者

  • 開啟:enable.idempotence=true + acks=all
  • 建議:max.in.flight.requests.per.connection<=5(保守有序),允許 retries
  • 語義:分區內 Exactly-once(防重復)

為什么需要:

  • 普通重試會導致同一分區重復寫;冪等用序號去重,避免“多扣一次款”“重復觸發”。
  • 注意它只保證“分區內”恰一次;跨分區一致性需要事務。

5. 事務性生產者

  • 目標:跨分區/主題的一致性(要么全成要么全不成
  • 配置:transactional.id=<穩定唯一>(自動啟用冪等)
  • 流程:initTransactions()beginTransaction() → 多次 produce()commitTransaction() / abortTransaction()
  • 消費端:isolation.level=read_committed 才只讀到已提交數據

使用時機:跨分區/多主題的原子寫入(訂單主表 + 變更日志、狀態轉換流水)。
代價:更高延遲、更多狀態管理;失敗路徑必須 abort_transaction()


6. QoS(服務質量)解析

Kafka 不用 MQTT 的“QoS 0/1/2”叫法,但可用配置實現三種常見語義:最多一次 / 至少一次 / 恰一次

6.1 語義與取舍

語義定義典型場景風險/成本
最多一次 (At-most-once)可能丟,不重復海量日志、低價值埋點可靠性低,但延遲/吞吐最好
至少一次 (At-least-once)不丟,可重復訂單事件、賬務(下游冪等)需去重;可能亂序
恰一次 (Exactly-once)不丟不重強一致流水、跨主題雙寫復雜度/開銷更高

6.2 參數映射(Python confluent-kafka)

決策速查:

  • 可丟?→ 最多一次(吞吐優先)
  • 不可丟,但可重放?→ 至少一次(下游去重)
  • 不丟不重?→ 分區內冪等;跨分區需要事務 + read_committed

A. 最多一次(吞吐/時延優先)

conf = {"bootstrap.servers": "localhost:9092","acks": "0","enable.idempotence": False,"retries": 0,"compression.type": "zstd","linger.ms": 20,"batch.size": 128 * 1024,"max.in.flight.requests.per.connection": 8,
}

B. 至少一次(可靠優先,允許重復)

conf = {"bootstrap.servers": "localhost:9092","acks": "all","enable.idempotence": False,         # 保持“至少一次”"compression.type": "zstd","linger.ms": 10,"batch.size": 64 * 1024,"request.timeout.ms": 30000,"delivery.timeout.ms": 120000,"retries": 2147483647,               # 近似無限重試"max.in.flight.requests.per.connection": 6,  # 吞吐高但可能亂序
}

C. 恰一次(分區內)

conf = {"bootstrap.servers": "localhost:9092","acks": "all","enable.idempotence": True,          # 冪等"compression.type": "zstd","linger.ms": 10,"batch.size": 64 * 1024,"max.in.flight.requests.per.connection": 5,  # 保守
}

D. 恰一次(事務,跨分區/主題)

from confluent_kafka import Producer, KafkaExceptionconf = {"bootstrap.servers": "localhost:9092","acks": "all","enable.idempotence": True,"transactional.id": "biz-tx-producer-001",   # 穩定唯一"compression.type": "zstd","linger.ms": 10,
}
p = Producer(conf)
p.init_transactions()
try:p.begin_transaction()# ... 多次 p.produce()p.commit_transaction()
except KafkaException:p.abort_transaction()
finally:p.flush()

快速選型

  • 可丟?→ 最多一次

  • 不可丟,可重?→ 至少一次

  • 不可丟不可重:

    • 單分區/單主題→冪等
    • 跨分區/多主題→事務(+ read_committed

7. 參數建議表

參數推薦/說明
acksall(可靠);0/1(吞吐)
enable.idempotencetrue(防重復,分區內恰一次)
transactional.id需要事務時設置穩定唯一值
linger.ms5–20ms(攢批)
batch.size32–128KB
compression.typezstd
max.in.flight.requests.per.connection≤5(配合冪等/順序)
delivery.timeout.ms120000(端到端交付窗口)
request.timeout.ms30000

8. Python 代碼示例

8.1 冪等生產(非事務)

from confluent_kafka import Producer
import socketconf = {"bootstrap.servers": "localhost:9092","client.id": socket.gethostname(),"acks": "all","enable.idempotence": True,"compression.type": "zstd","linger.ms": 10,"batch.size": 64 * 1024,"max.in.flight.requests.per.connection": 5,
}producer = Producer(conf)def dr_cb(err, msg):if err:print("Delivery failed:", err)else:print(f"Delivered to {msg.topic()}[{msg.partition()}]@{msg.offset()}")for i in range(100):producer.produce("demo-topic", key=f"k-{i%10}", value=f"v-{i}", on_delivery=dr_cb)producer.flush()

8.2 事務性生產

from confluent_kafka import Producer, KafkaExceptionconf = {"bootstrap.servers": "localhost:9092","acks": "all","enable.idempotence": True,"transactional.id": "order-tx-producer-001","compression.type": "zstd","linger.ms": 10,
}p = Producer(conf)
p.init_transactions()try:p.begin_transaction()for i in range(10):p.produce("orders", key=f"order-{i}", value=f"created-{i}")p.produce("orders-changelog", key=f"order-{i}", value=f"log-{i}")p.commit_transaction()
except KafkaException as e:p.abort_transaction()raise
finally:p.flush()

9. 實踐建議 & 常見坑

  • 可靠性acks=all + min.insync.replicas>=2 + replication.factor>=3;禁用 unclean.leader.election
  • 順序與吞吐max.in.flight 越大吞吐越高但更易亂序;冪等場景≤5更穩。
  • 重試與時限delivery.timeout.ms 控制“最終失敗”窗口;與 retries/request.timeout.ms 搭配。
  • 監控record-send-raterequest-latency-avgrecord-retry-raterecord-error-ratecompression-rate-avg、批大小均值等。
  • 不要混用語義:冪等+acks=1/0 無法保證語義;事務端若消費端沒開 read_committed 仍會讀到未提交。
  • 熱點分區:同一個/少量 key 寫入過多導致傾斜;用“主鍵+鹽值”或更均勻的 key;需要有序時結合復合 key 但保留可聚合性。
  • 壓縮依賴缺失snappy/lz4/zstd 未安裝會觸發錯誤;本倉庫已做降級/回退,生產環境記得安裝依賴。
  • IPv6 坑:macOS 上 localhost 解析為 ::1 可能連不上,用 127.0.0.1 或設置 KAFKA_BOOTSTRAP

10. 使用本倉庫封裝(kafka-python)快速上手

本倉庫 lesson_three/common.py 封裝了穩健默認值,便于快速演示與接入。適合需要直接跑通的同學。

from lesson_three.common import make_producer, warmup_producer, close_safely
from datetime import datetimetopic = "demo.producer"
producer = make_producer(acks="all",                 # 可靠linger_ms=10,                # 攢批batch_size=64 * 1024,compression_type="gzip",    # 默認無需額外依賴;可換 zstd
)try:warmup_producer(producer, topic)for i in range(10):producer.send(topic,key=f"user-{i % 3}",value={"ts": datetime.now().isoformat(), "i": i},)producer.flush()
finally:close_safely(producer)

說明:該封裝基于 kafka-python,不提供“冪等/事務”語義;若需事務/冪等,請使用上文的 confluent-kafka 示例。


11. 典型業務場景 → 推薦配置映射

場景目標關鍵配置備注
海量埋點/日志吞吐與成本優先,可容忍少量丟失acks=0compression=zstdlinger.ms=20batch.size=128KB服務器端配合更高批量、異步落庫
訂單事件(允許重復)不丟但可重復acks=allenable.idempotence=falseretries≈∞delivery.timeout.ms=120s下游按業務鍵去重;max.in.flight 可放寬到 6–8
單分區強一致流水分區內“恰一次”acks=allenable.idempotence=truemax.in.flight<=5同一業務鍵路由到同一分區,避免跨分區一致性
跨主題雙寫(訂單+變更日志)跨分區/主題一致transactional.id 唯一、開啟事務;消費端 read_committed失敗時必須 abort_transaction()
IoT 傳感器高頻上報延遲敏感、可容忍丟失acks=0/1linger.ms<=5compression=zstd批量不要過大,避免尾延遲

12. 生產就緒檢查清單(Checklist)

  • 集群與主題
    • 確認 replication.factor>=3min.insync.replicas>=2
    • 關閉 unclean.leader.election
    • 針對大消息配置 message.max.bytesreplica.fetch.max.bytes
  • Producer 端
    • 可靠性:acks=all + 合理 retries/delivery.timeout.ms
    • 順序:冪等場景將 max.in.flight.requests.per.connection<=5
    • 吞吐:合理設置 batch.sizelinger.ms,開啟 compression.type=zstd
    • 觀測:埋點回調錯誤率、平均批大小、壓縮率、請求時延
  • 事務流
    • transactional.id 穩定唯一且可恢復
    • 失敗路徑必須 abort_transaction(),并處理補償邏輯
    • 消費側開啟 isolation.level=read_committed
  • 運維監控
    • 指標:record-send-raterecord-error-raterequest-latency-avgrecord-retry-rate
    • Lag 監控與告警;主題分區熱點檢查

13. 實戰案例

案例 A:訂單創建 + 變更日志雙寫(事務)

需求:訂單主數據寫 orders,同時寫審計 orders-changelog,兩者必須同時成功或同時失敗。

關鍵點:使用事務性生產者;消費側使用 read_committed;失敗路徑 abort_transaction()

from confluent_kafka import Producer, KafkaExceptionconf = {"bootstrap.servers": "localhost:9092","acks": "all","enable.idempotence": True,"transactional.id": "order-tx-producer-001","compression.type": "zstd",
}p = Producer(conf)
p.init_transactions()try:p.begin_transaction()p.produce("orders", key="order-1001", value="created")p.produce("orders-changelog", key="order-1001", value="audit-created")p.commit_transaction()
except KafkaException:p.abort_transaction()raise
finally:p.flush()

案例 B:埋點日志高吞吐上報(最多一次)

目標:極致吞吐與成本,允許少量丟失。

建議:acks=0compression=zstdlinger.ms=20batch.size=128KB

from confluent_kafka import Producerconf = {"bootstrap.servers": "localhost:9092","acks": "0","compression.type": "zstd","linger.ms": 20,"batch.size": 128 * 1024,
}p = Producer(conf)
for i in range(100000):p.produce("tracking", value=f"event-{i}")
p.flush()

需要的話,我可以把這篇再導成 Markdown 文件或加一頁“參數對照速查卡”。


14. 在線 HTML 演示(本地運行)

為了直觀理解 acks/批量/壓縮/key 對分區與吞吐的影響,提供了一個極簡的網頁 Demo(基于 FastAPI)。

目錄:lesson_three/web_demo

  1. 安裝依賴(建議虛擬環境)
pip install fastapi uvicorn kafka-python pydantic
  1. 啟動 Demo(默認 http://127.0.0.1:8000)
uvicorn lesson_three.web_demo.main:app --reload
  1. 打開瀏覽器訪問,填寫參數并發送
http://127.0.0.1:8000/

說明:

  • 后端復用本倉庫 lesson_three/common.pymake_producer/warmup_producer 封裝。
  • 該 Demo 基于 kafka-python,用于直觀理解批量/壓縮/QoS 的實際效果。
  • 如需“冪等/事務”語義,請參考上文 confluent-kafka 示例。

15. Web Demo 實驗手冊(一步步做)

實驗前提:已按第 14 節啟動 Demo,瀏覽器打開 http://127.0.0.1:8000/

  1. 同 key 同分區(驗證分區器)
  • 設置:acks=allkey 分桶數=4num_messages=1000、其他默認
  • 觀察:返回 JSON 的 samples 中相同 keypartition 應保持一致;partition_histogram 會顯示命中的分區與次數。
  1. 攢批換吞吐(驗證 batch/linger)
  • 對比 A:linger.ms=0batch.size=32768 與 B:linger.ms=20batch.size=131072
  • 觀察:B 的 msgs_per_sec 通常更高,但 elapsed_ms 可能略大(延遲換吞吐)。
  1. 壓縮算法對比(網絡 vs CPU)
  • 依次選擇 compression.type=none/gzip/zstd(消息量 10000+ 更明顯)
  • 觀察:zstd 在網絡瓶頸場景下吞吐更優;若 CPU 緊張,可能 gzip/none 更穩。
  1. 可靠性與時延取舍(acks)
  • 對比:acks=0acks=1acks=all
  • 觀察:acks 越強,elapsed_ms 越大;在 broker 異常時,acks=all 可能返回錯誤或顯著變慢,acks=0“更快但有風險”。
  1. 分區傾斜(熱點 key)
  • 設置:key 分桶數=2num_messages=5000
  • 觀察:partition_histogram 若某分區遠高于其他分區,說明出現熱點,需優化 key 設計(見第 17 節)。

返回結果字段說明(來自 /api/send):

  • elapsed_ms:端到端發送耗時;msgs_per_sec:估算吞吐
  • samples[]:采樣若干條寫入結果(含 key/partition/offseterror
  • partition_histogram:采樣命中分區的計數直方圖
  • distinct_partitions:命中的唯一分區數
  • sample_count / error_count:采樣條數與失敗數

k2
image
image

16. Web Demo 故障排查

  • API 返回非 JSON,頁面提示 Unexpected token 'I' ...

    • 原因:后端 500 錯誤被瀏覽器當作文本解析。已在 Demo 中統一返回 JSON 錯誤并在前端降級顯示文本;若仍出現,請查看 uvicorn 控制臺日志。
  • Kafka 連不通或超時:

    • 確認本地/遠端 Kafka 已啟動;必要時導出 KAFKA_BOOTSTRAP 環境變量(建議 127.0.0.1:9092 避免 IPv6 解析)。
    • 端口占用或網絡策略限制時,優先用 IP 而非 localhost
  • 壓縮算法不可用:

    • kafka-pythonsnappy/lz4/zstd 需要額外依賴;若未安裝會拋出斷言錯誤。Demo 將返回 500。
    • 解決:改用 gzip/none,或安裝對應壓縮庫(如 pip install python-snappy lz4 zstandard)。
  • 分區/偏移不顯示:

    • acks=0 時無確認,不保證返回元數據;改用 acks=1/all 驗證。

17. 生產者實踐技巧(落地經驗)

  • Key 設計與傾斜治理:

    • 盡量使用業務主鍵或其哈希作為 key,保證同一實體有序且分散。
    • 發現 partition_histogram 傾斜時,可引入“復合 key(主鍵 + 鹽值)”、時間片打散,或增加分區數并配合再均衡。
  • 壓縮選型:

    • 優先 zstd(壓縮率/速度折中好);CPU 緊張或未裝依賴時可退回 gzip
    • 關注 compression-rate-avg 與端側 CPU 使用率,動態調參。
  • 順序與吞吐:

    • 需要“分區內有序”且冪等 → enable.idempotence=true + acks=all + max.in.flight<=5(在 confluent-kafka 中配置)。
    • 追求吞吐 → 放寬 max.in.flight,增大 batch.size,增加 linger.ms
  • 超時與重試:

    • delivery.timeout.ms 定義“最終失敗”窗口;與 request.timeout.msretries 配合使用。
    • 監控 record-retry-raterecord-error-rate,排查網絡抖動或 ISR 不足。
  • 批大小與內存:

    • batch.size 是單分區批上限;過大可能增加尾延遲與內存占用。
    • 搭配 linger.ms 小步調優,觀察平均批大小與 99 線時延。
  • 監控指標(建議接入可視化):

    • 發送速率、請求時延、重試/錯誤率、平均批大小、壓縮率、每分區寫入速率;結合消費端 lag 與分區熱點。

A. 術語小抄(Glossary)

  • Producer:生產者客戶端,負責寫消息到 Kafka。
  • RecordAccumulator:客戶端側的分區批緩沖區,受 batch.size/linger.ms 影響。
  • Partition:主題的分片;同一分區內寫入有序。
  • Key(分區鍵):哈希后決定分區;同 key 同分區,便于聚合與有序。
  • Sticky Partitioner:無 key 時使用的“粘性分區器”,提升批量效率。
  • acks:寫入確認級別(0/1/all);越強越可靠,延遲越大。
  • ISR(In-Sync Replicas):與 leader 同步的副本集合。
  • Idempotent Producer:冪等生產者;分區內 Exactly-once(不重復)。
  • Transactional Producer:事務生產者;跨分區/主題的原子性(要么全成)。
  • EOS(Exactly-once Semantics):恰一次語義;分區內靠冪等,跨分區靠事務+read_committed
  • batch.size:單分區批上限字節;越大吞吐越高、尾延遲越高。
  • linger.ms:攢批等待時間;增大可提升吞吐、增加延遲。
  • max.in.flight.requests.per.connection:同連接并行請求數;大→吞吐高但易亂序。
  • compression.type:壓縮算法(zstd/gzip/snappy/lz4/none)。
  • delivery.timeout.ms:端到端交付窗口(超過視為失敗)。
  • request.timeout.ms:單次請求超時。
  • replication.factor:副本數;min.insync.replicas:可寫入需要的最小同步副本。
  • unclean.leader.election:是否允許非同步副本選主;生產禁用以防數據倒退。
  • read_committed:消費者只讀已提交的事務消息。
  • Lag:消費者相對最新偏移的滯后量。

B. 常見問題(FAQ)

Q1:acks=all 還可能丟嗎?

  • 會的:當 replication.factor 太小、min.insync.replicas 設置不當或啟用了 unclean.leader.election 時,發生失敗切換可能導致丟失或倒退。生產建議:replication.factor>=3min.insync.replicas>=2、禁用 unclean.leader.election

Q2:冪等就是全局恰一次嗎?

  • 不是。冪等僅保證“分區內”不重復。跨分區/主題要恰一次需要事務,并在消費端打開 read_committed

Q3:事務和冪等的關系?

  • 事務會自動啟用冪等。冪等解決“分區內重復”,事務解決“跨分區原子性”。

Q4:吞吐很低怎么辦?

  • 增大 batch.sizelinger.ms,開啟 compression=zstd;檢查網絡/磁盤瓶頸;放寬 max.in.flight(非冪等場景)。

Q5:延遲太高怎么辦?

  • 降低 linger.ms,適度減小 batch.size;必要時用 acks=1(權衡可靠性)。

Q6:為什么看到亂序?

  • 重試 + max.in.flight 過大易亂序;冪等場景收斂到 <=5;同 key 才能談“有序”。

Q7:如何判斷分區熱點?

  • 觀察分區寫入速率、消費者 Lag 與本文 Web Demo 的 partition_histogram。熱點時優化 key(主鍵+鹽值/復合 key)或擴分區并再均衡。

Q8:壓縮用什么?

  • 優先 zstd;CPU 緊張或依賴安裝困難時退 gzip;網絡空閑時可暫不開啟。

Q9:KafkaTimeoutError: Timeout after waiting for 30 secs. 怎么辦?

  • 多為連不通或 topic 不存在。優先使用 IPv4:KAFKA_BOOTSTRAP=127.0.0.1:9092,確認 kafka-topics.sh --create --topic <name> 已創建;重啟 Demo 后再試。

Q10:Demo 為什么 acks=0 時 sample 沒有分區/偏移?

  • 因為不等待確認,客戶端未必拿到元數據。以吞吐/耗時評估即可,驗證分區請改用 acks=1/all

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96006.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96006.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序截屏與錄屏功能詳解

微信小程序提供了豐富的API支持截屏和錄屏功能&#xff0c;適用于多種場景&#xff0c;如教育類應用的課程錄制、游戲類應用的精彩瞬間分享、電商類應用的商品展示等。以下將詳細介紹實現方法和應用案例。 截屏功能實現 截屏功能通過調用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

寫在前面 在函數式組件主導的 React 項目中&#xff0c;高階組件&#xff08;HOC&#xff09;并非首選推薦&#xff0c;更建議優先使用 Hooks來實現復用邏輯。核心原因是 HOC 存在固有的設計缺陷&#xff0c;而 Hooks 能更優雅、簡潔地解決相同問題&#xff0c;同時避免 HOC 的…

【 蒼穹外賣 | Day2】

1. 相關視頻 Day2的全部視頻集數 2. 學習記錄 2.1 對象屬性拷貝 當DTO與實體類或者VO對象之間的一個裝換的時候&#xff0c;如果通過new創建對象&#xff0c;然后調用set方法進行屬性賦值&#xff0c;不夠方便&#xff0c;代碼不夠簡潔。當屬性過多時候&#xff0c;代碼就會…

焊接自動化測試平臺圖像處理分析-模型訓練推理

1、使用技術棧&#xff1a;jdk17/springboot/python/opencv/yolov8 2、JAVA環境搭建 JDK17下載安裝&#xff1a;wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解壓軟件 tar -xf jdk-17.0.16_linux-x64_bin.tar.gz 配置全局變量 vim /etc/p…

【python實用小腳本-205】[HR揭秘]手工黨逐行查Bug的終結者|Python版代碼質量“CT機”加速器(建議收藏)

1. 場景故事 “作為HR&#xff0c;我曾用2小時逐行審閱50份Python簡歷項目&#xff0c;直到發現候選人的代碼復雜度超標導致線上事故…” → 轉折點&#xff1a;用麥凱布&#xff08;McCabe&#xff09;圈復雜度檢測腳本&#xff0c;30秒掃描全倉庫&#xff0c;現可100%攔截“高…

LeetCode - 1089. 復寫零

題目 1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路 這道題我首先想到的是從前往后雙指針&#xff0c;但是這樣做會造成數據的覆蓋&#xff0c;比如說下面的這個情況 所以解決的方法就是從后往前去復寫&#xff0c;但是從后往前的話就要知道最后一個有效元素是…

c#中public類比博圖

簡單來說&#xff0c;**public 定義了“接口”或“引腳”**&#xff0c;就像你的FB塊上的 Input, Output, InOut 管腳一樣。它決定了外部的其他代碼&#xff08;如另一個FB或OB1&#xff09;可以看到和操作這個塊里的什么東西。讓我用你最熟悉的博圖概念來詳細類比一下。---###…

K8s基于節點軟親和的高 CPU Pod 擴容與優先調度方案

場景與目標 集群節點&#xff1a;master&#xff08;4 核&#xff09;、node1&#xff08;16 核&#xff09;、node2&#xff08;16 核&#xff09;。目標&#xff1a;將一個高 CPU 消耗的工作負載橫向擴展到 4 個實例&#xff0c;并通過**節點親和性&#xff08;軟親和&#…

MySQL InnoDB 的鎖機制

引言 鎖是數據庫管理并發訪問的另一種核心機制&#xff0c;與 MVCC 相輔相成。本文將系統梳理 MySQL InnoDB 中鎖的粒度、類型和工作原理&#xff0c;并深入探討它如何與事務隔離級別配合&#xff0c;共同保障數據的一致性和完整性。 一、 鎖的粒度&#xff1a;由粗到細 InnoD…

狀態模式(State Pattern)——網絡連接場景的 C++ 實戰

一、為什么要用狀態模式&#xff1f;在開發中&#xff0c;經常遇到“對象在不同狀態下行為不同”的情況。最常見的寫法是用一堆 if/else 或 switch 來判斷狀態&#xff0c;然后在不同分支里寫邏輯。這樣做有兩個問題&#xff1a;狀態增多后&#xff0c;條件分支會變得臃腫。修改…

使用csi-driver-nfs實現K8S動態供給

文章目錄一、部署NFS二、k8s環境部署csi-nfs三、測試動態供給補充應用服務器IPnfs-server192.168.1.5k8s-master01192.168.1.1k8s-node01192.168.1.2k8s-node02192.168.1.3 一、部署NFS 1、在NFS服務端和k8s所有節點部署nfs-utils 因為客戶端去掛載nfs服務端的共享目錄時&…

【開題答辯全過程】以 基于ssm的房屋中介管理系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

MySQL主從復制之進階延時同步、GTID復制、半同步復制完整實驗流程

1.主從同步1.1主從同步原理是指將主庫的DDL和DML操作通過二進制日志(binlog)傳到從庫服務器&#xff0c;然后在從庫上對這些日志進行重新執行&#xff0c;從而使從庫和主庫數據保持一致1.2環境設置庫名ip地址操作系統mysql版本主庫msyql-master192.168.31.228rhel7.9源碼安裝my…

織信低代碼:用更聰明的方式,把想法變成現實!

你有沒有過這樣的時刻&#xff1f;想親手做一個應用&#xff0c;卻因為“不會編碼”而遲遲沒有開始&#xff1b;或曾無奈地目睹公司里一個看似簡單的需求&#xff0c;硬是耗費數月、投入大量人力反復開發……現在&#xff0c;有一類工具正在改變這一切。它叫低代碼。而今天我們…

【序列晉升】28 云原生時代的消息驅動架構 Spring Cloud Stream的未來可能性

目錄 一、Spring Cloud Stream是什么&#xff1f; 二、誕生背景與設計動機 2.1 微服務架構的挑戰 2.2 Spring生態的發展 2.3 Spring Integration的演進 三、架構設計與核心組件 3.1 分層架構設計 3.2 核心組件詳解 3.3 編程模型 四、解決的問題與優勢 4.1 解決的核心…

內網后滲透攻擊--linux系統(權限維持)

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目)

C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目) code review! 參考筆記: 1.C++筆記之同步信號量、互斥信號量與PV操作再探(含軟考題目) 2.C++筆記之信號量、互斥量與PV操作 參考鏈接 1.嵌入式基礎知識-信號量,PV原語與前趨圖 2.信號量、PV操作及軟考高級試題解析…

布隆過濾器:快速判斷某個元素是否存在

特點&#xff1a;高效、空間占用小、允許一定誤判 布隆過濾器在 Redis 里的實現機制&#xff0c;核心就是&#xff1a;用一個大位圖&#xff08;bitmap&#xff09;來表示集合 位圖長度 m 初始值都是 0 插入元素時通過 k 個不同的哈希函數&#xff0c;對元素做哈希 每個哈希結…

C# 修改基類List中某一元素的子類類型

描述&#xff1a;基類&#xff1a;BaseClass子類1&#xff1a;A子類2&#xff1a;B然后我有一個List<BaseClass>類型的鏈表:list&#xff0c;我先往list中添加了兩個元素&#xff1a;第一個元素為A類型&#xff0c;第二個元素為B類型&#xff0c;然后我想改變第一個元素類…

基于STM32智能陽臺監控系統

基于STM32智能陽臺監控系統&#xff08;程序&#xff0b;原理圖元件清單&#xff09;功能介紹具體功能&#xff1a;1.采用STM32作為主控芯片實現檢測和控制&#xff1b;2.通過光敏電阻采集光線&#xff0c;將當前光線值在LCD1602顯示&#xff0c;低于50%控制LED亮&#xff0c;高…