使用 Kafka 優化物流系統的實踐與思考

使用 Kafka 優化物流系統的實踐與思考

在現代物流系統中,訂單處理、倉儲管理、運輸調度等環節復雜且實時性要求高。為了滿足異步解耦、高吞吐、高可用、事件驅動和數據可靠性等需求,Kafka 作為分布式消息隊列和流處理平臺,成為了我們的首選。本文將分享我們在物流系統中使用 Kafka 的設計方案、優化實踐以及遇到的問題和解決方案。

一、系統背景和需求

物流系統涉及多個業務模塊,如訂單處理、倉儲管理、運輸調度和狀態跟蹤等。為了實現模塊間的異步解耦,避免同步調用阻塞,我們需要一個高吞吐、高可用的事件驅動架構。同時,消息的可靠性和順序性也是我們關注的重點,以確保數據不丟失并保持一致性。

二、Kafka 在物流系統中的角色

在我們的物流系統中,Kafka 扮演了以下角色:

  • 事件總線:各業務模塊通過 Kafka 交換事件消息,實現松耦合。
  • 異步緩沖:通過削峰填谷,緩解高峰壓力。
  • 數據管道:將業務數據流轉到分析、監控、告警系統。
  • 解耦中間件:模塊間松耦合,方便獨立擴展和維護。

三、核心業務場景與事件流

1. 訂單創建與處理

用戶下單后,訂單服務發送訂單創建事件,倉儲服務和運輸服務消費該事件,進行備貨和運輸調度。

訂單創建事件流示例

訂單服務發送訂單創建事件:

from kafka import KafkaProducer
import jsondef create_order_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'))def send_order_created_event(producer, order_id, order_details):event = {'order_id': order_id,'details': order_details}producer.send('order-events', key=order_id.encode('utf-8'), value=event)# 示例調用
producer = create_order_producer()
send_order_created_event(producer, '12345', {'item': 'Laptop', 'quantity': 1})
producer.flush()
producer.close()

2. 倉儲管理

倉庫的入庫、出庫和庫存變更事件通過 Kafka 發送,庫存服務和財務服務消費這些事件。

倉儲事件流示例

倉儲服務發送庫存變更事件:

from kafka import KafkaProducer
import jsondef create_warehouse_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'))def send_inventory_update_event(producer, product_id, change):event = {'product_id': product_id,'change': change}producer.send('warehouse-events', key=product_id.encode('utf-8'), value=event)# 示例調用
producer = create_warehouse_producer()
send_inventory_update_event(producer, '98765', {'change': -10})
producer.flush()
producer.close()

3. 運輸調度與跟蹤

運輸任務的創建和狀態更新事件由運輸服務發送,訂單服務和客戶通知服務消費。

運輸事件流示例

運輸服務發送運輸狀態更新事件:

from kafka import KafkaProducer
import jsondef create_shipping_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'))def send_shipping_status_event(producer, shipment_id, status):event = {'shipment_id': shipment_id,'status': status}producer.send('shipment-events', key=shipment_id.encode('utf-8'), value=event)# 示例調用
producer = create_shipping_producer()
send_shipping_status_event(producer, '54321', {'status': 'in_transit'})
producer.flush()
producer.close()

4. 異常處理與告警

異常事件通過 Kafka 發送,告警服務和客服系統消費這些事件。

異常事件流示例

告警服務發送異常事件:

from kafka import KafkaProducer
import jsondef create_alert_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'))def send_alert_event(producer, alert_id, alert_details):event = {'alert_id': alert_id,'details': alert_details}producer.send('alert-events', key=alert_id.encode('utf-8'), value=event)# 示例調用
producer = create_alert_producer()
send_alert_event(producer, 'alert123', {'type': 'delay', 'description': 'Shipment delayed'})
producer.flush()
producer.close()

通過這些詳細的陳述和核心代碼示例,我們可以更好地理解和應用 Kafka,以支持復雜的物流系統需求。Kafka 的使用不僅提高了系統的靈活性和響應能力,還確保了數據的可靠性和順序性。

四、Kafka 主題設計

在設計 Kafka 主題時,我們根據業務模塊的不同需求劃分了多個主題。每個主題都對應一個特定的業務領域,以便于管理和擴展。合理設置主題的分區數和保留時間是確保消息順序性和系統吞吐量的關鍵。

主題劃分
  • order-events 主題:用于處理訂單相關的事件,如訂單創建、更新和取消。
  • shipment-events 主題:用于處理運輸任務及狀態更新事件。
  • warehouse-events 主題:用于處理倉儲相關的事件,如庫存入庫和出庫。
  • alert-events 主題:用于處理異常和告警事件。
主題配置示例

在創建主題時,我們需要根據業務需求設置合適的分區數和保留時間。分區數影響并行處理能力,而保留時間決定了消息在 Kafka 中的存儲時長。

# 創建 order-events 主題,設置 3 個分區和 7 天的保留時間
kafka-topics.sh --create --topic order-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 --config retention.ms=604800000# 創建 shipment-events 主題,設置 3 個分區和 7 天的保留時間
kafka-topics.sh --create --topic shipment-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 --config retention.ms=604800000# 創建 warehouse-events 主題,設置 3 個分區和 7 天的保留時間
kafka-topics.sh --create --topic warehouse-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 --config retention.ms=604800000# 創建 alert-events 主題,設置 3 個分區和 7 天的保留時間
kafka-topics.sh --create --topic alert-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 --config retention.ms=604800000

五、生產者設計

生產者負責將業務事件發送到相應的 Kafka 主題。為了提高系統的吞吐量和保證消息的順序性,我們在生產者設計中采用了異步發送和合適的 key 設置。

生產者配置
  • 異步發送:通過異步發送提高消息的吞吐量。
  • key 設置:使用業務實體 ID 作為 key,確保同一實體的消息發送到同一分區,從而保證順序。
  • 重試機制:配置重試機制,確保在網絡抖動或臨時故障時能夠重試發送。
生產者代碼示例

以下是一個生產者的代碼示例,展示了如何發送訂單事件:

from kafka import KafkaProducer
import jsondef create_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'),retries=5,  # 發送失敗重試次數acks='all',  # 確保消息被所有副本確認enable_idempotence=True  # 開啟冪等性)def send_order_event(producer, order_id, order_details):order_event = {'order_id': order_id,'details': order_details}try:# 使用 order_id 作為 key,確保同一訂單的消息順序future = producer.send('order-events', key=order_id.encode('utf-8'), value=order_event)result = future.get(timeout=10)  # 異步發送print(f"Message sent to {result.topic} partition {result.partition} offset {result.offset}")except Exception as e:print(f"Failed to send message: {e}")# 示例調用
producer = create_producer()
send_order_event(producer, '12345', {'item': 'Laptop', 'quantity': 1})
producer.flush()
producer.close()

六、消費者設計

消費者負責從 Kafka 主題中消費消息并進行處理。為了實現負載均衡和冪等處理,我們在消費者設計中使用了消費者組和消息重試機制。

消費者配置
  • 消費者組:通過消費者組實現負載均衡,多個消費者可以共同消費一個主題的消息。
  • 冪等處理:確保每條消息只被處理一次,避免重復消費。
  • 消息重試和死信隊列:在處理失敗時支持消息重試或轉入死信隊列。
消費者代碼示例

以下是一個消費者的代碼示例,展示了如何消費訂單事件:

from kafka import KafkaConsumer
import jsondef create_consumer(group_id, topic):return KafkaConsumer(topic,bootstrap_servers='localhost:9092',group_id=group_id,value_deserializer=lambda m: json.loads(m.decode('utf-8')),enable_auto_commit=False  # 手動提交偏移量)def process_message(message):# 冪等處理邏輯print(f"Processing message: {message}")def consume_events(consumer):for message in consumer:try:process_message(message.value)consumer.commit()  # 手動提交偏移量except Exception as e:print(f"Failed to process message: {e}")# 將消息轉入死信隊列或重試handle_failed_message(message.value)def handle_failed_message(message):# 處理失敗的消息print(f"Handling failed message: {message}")# 示例調用
consumer = create_consumer('order-service-group', 'order-events')
consume_events(consumer)

七、數據流示意

通過 Kafka,我們實現了從用戶下單到訂單服務、倉儲服務、運輸服務、異常監控服務和通知服務的完整數據流。以下是數據流的簡要描述:

  1. 用戶下單后,訂單服務發送訂單創建事件到 order-events 主題。
  2. 倉儲服務和運輸服務消費 order-events 主題,進行備貨和運輸調度。
  3. 運輸服務發送運輸狀態更新事件到 shipment-events 主題。
  4. 異常監控服務消費 shipment-events 主題,監控運輸狀態。
  5. 通知服務消費 alert-events 主題,向用戶發送通知。

八、消息格式設計

我們采用 JSON 格式設計消息結構,包含事件類型、唯一事件 ID、時間戳等信息,方便解析和處理。

消息格式示例
{"event_type": "order_created","event_id": "evt-12345","timestamp": "2023-10-01T12:00:00Z","payload": {"order_id": "12345","customer_id": "cust-67890","items": [{"item_id": "item-001", "quantity": 2},{"item_id": "item-002", "quantity": 1}]}
}

九、容錯與高可用設計

為了保證系統的高可用性和容錯性,我們部署了多節點 Kafka 集群,并開啟了副本機制。生產者和消費者的配置也進行了優化,以確保消息不丟失和冪等處理。

容錯與高可用配置
  1. Kafka 集群配置

    • 部署多節點 Kafka 集群,設置副本因子為 3。副本因子決定了每個分區的副本數量,確保在節點故障時仍然可以訪問數據。
    • 開啟自動 leader 選舉,確保節點故障時的高可用性。Kafka 會自動選擇新的 leader 來替代故障的 leader,從而保證集群的穩定性。
    # 創建主題時設置副本因子
    kafka-topics.sh --create --topic order-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 3
    
  2. 生產者配置

    • 設置 retriesacks 參數,確保消息發送的可靠性。retries 參數指定了發送失敗時的重試次數,acks 參數確保消息被所有副本確認。
    • 使用冪等性配置(enable.idempotence=true)避免重復消息。冪等性配置確保生產者在重試時不會產生重復的消息。
    from kafka import KafkaProducer
    import jsondef create_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'),retries=5,  # 發送失敗重試次數acks='all',  # 確保消息被所有副本確認enable_idempotence=True  # 開啟冪等性)def send_event(producer, topic, key, event):try:future = producer.send(topic, key=key.encode('utf-8'), value=event)result = future.get(timeout=10)  # 異步發送print(f"Message sent to {result.topic} partition {result.partition} offset {result.offset}")except Exception as e:print(f"Failed to send message: {e}")# 示例調用
    producer = create_producer()
    event = {'event_type': 'order_created', 'order_id': '12345', 'timestamp': '2023-10-01T12:00:00Z'}
    send_event(producer, 'order-events', '12345', event)
    producer.close()
    
  3. 消費者配置

    • 使用消費者組實現負載均衡。消費者組允許多個消費者共同消費一個主題的消息,每個消費者處理不同的分區,從而實現負載均衡。
    • 手動提交偏移量,確保消息處理的冪等性。手動提交偏移量可以確保只有在消息處理成功后才更新偏移量,避免重復消費。
    • 處理失敗時,將消息轉入死信隊列以便后續分析。死信隊列用于存儲處理失敗的消息,方便后續分析和處理。
    from kafka import KafkaConsumer
    import jsondef create_consumer(group_id, topic):return KafkaConsumer(topic,bootstrap_servers='localhost:9092',group_id=group_id,value_deserializer=lambda m: json.loads(m.decode('utf-8')),enable_auto_commit=False  # 手動提交偏移量)def process_message(message):# 實現冪等處理邏輯print(f"Processing message: {message}")def consume_events(consumer):for message in consumer:try:process_message(message.value)consumer.commit()  # 手動提交偏移量except Exception as e:print(f"Failed to process message: {e}")# 可以將消息轉入死信隊列# 示例調用
    consumer = create_consumer('order-service-group', 'order-events')
    consume_events(consumer)
    
  4. 監控與告警

    • 使用 Kafka 自帶的 JMX 指標進行監控。Kafka 提供了豐富的 JMX 指標,可以監控集群的運行狀態、消息的吞吐量、延遲等。
    • 配置告警系統,及時處理 Kafka 集群的異常情況。可以使用 Prometheus 和 Grafana 等工具進行監控和告警配置。
    # Prometheus 配置示例
    global:scrape_interval: 15sscrape_configs:- job_name: 'kafka'static_configs:- targets: ['localhost:9092']
    
    # Grafana 告警配置示例
    apiVersion: 1datasources:- name: Prometheustype: prometheusurl: http://localhost:9090alerts:- name: KafkaHighLatencyrules:- alert: KafkaHighLatencyexpr: kafka_producer_latency > 100for: 5mlabels:severity: criticalannotations:summary: "Kafka producer latency is high"description: "Kafka producer latency has exceeded 100ms for more than 5 minutes."
    

通過這些設計和實現,我們可以確保物流系統中各個模塊的高效協作和數據的可靠傳遞。Kafka 的高可用性和容錯機制保證了系統的穩定性和可靠性,即使在節點故障或網絡異常的情況下,系統仍然能夠正常運行。

十、擴展與集成

Kafka的擴展與集成能力使其成為企業級數據處理的核心組件。通過Kafka Connect,我們可以將Kafka中的消息同步到各種數據倉庫和分析平臺,如數據庫、Elasticsearch、Hadoop等。同時,利用Kafka Streams或Flink,我們能夠實時處理和分析物流數據。此外,我們支持多系統(如財務系統、客戶服務系統)訂閱相關事件,實現業務協同。

10.1 Kafka Connect 示例

Kafka Connect是一個用于連接Kafka和其他數據系統的框架。以下是如何使用Kafka Connect將數據同步到Elasticsearch的示例:

{"name": "elasticsearch-sink","config": {"connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector","tasks.max": "1","topics": "order-events","key.ignore": "true","connection.url": "http://localhost:9200","type.name": "kafka-connect","name": "elasticsearch-sink"}
}
10.2 Kafka Streams 示例

Kafka Streams是一個用于實時處理數據流的庫。以下是一個簡單的Kafka Streams應用程序示例,用于處理訂單事件:

import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsBuilder;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;import java.util.Properties;public class OrderProcessor {public static void main(String[] args) {Properties props = new Properties();props.put(StreamsConfig.APPLICATION_ID_CONFIG, "order-processor");props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");StreamsBuilder builder = new StreamsBuilder();KStream<String, String> orderStream = builder.stream("order-events");orderStream.foreach((key, value) -> System.out.println("Processing order: " + value));KafkaStreams streams = new KafkaStreams(builder.build(), props);streams.start();}
}

十一、Kafka 使用過程中可能遇到的問題

在使用Kafka的過程中,我們可能會遇到以下問題:

  1. 重復消費:由于消費者宕機或網絡抖動,可能導致消息被重復消費。
  2. 消息丟失:生產者或消費者配置不當可能導致消息丟失。
  3. 消息積壓:消費者處理速度慢導致消息積壓。
  4. 消息順序錯亂:消息在不同分區間可能出現順序錯亂。
  5. 死信消息處理缺失:未處理的消息可能導致系統問題。
  6. 網絡抖動或Kafka集群故障:可能導致消息傳遞失敗。
  7. 數據格式不一致或兼容性問題:不同版本的消費者可能無法處理消息。

十二、解決方案

在使用Kafka的過程中,我們可能會遇到各種問題。以下是針對這些問題的詳細解決方案,包括具體的代碼示例和詳細解釋。

12.1 保證消息不丟失

為了確保消息不丟失,我們需要在生產者和消費者配置中采取一些措施:

  • 生產者配置

    • 開啟冪等性:冪等性確保生產者在重試時不會產生重復的消息。
    • 設置重試機制:重試機制允許生產者在發送失敗時進行多次嘗試。
    • 設置 acks 參數:acks='all' 確保消息被所有副本確認后才認為發送成功。
    from kafka import KafkaProducer
    import jsondef create_producer():return KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'),retries=5,  # 發送失敗重試次數acks='all',  # 確保消息被所有副本確認enable_idempotence=True  # 開啟冪等性)producer = create_producer()
    
  • 消費者配置

    • 關閉自動提交 offset:自動提交 offset 可能導致消息在處理失敗時被認為已經處理成功。
    • 手動提交 offset:確保只有在消息處理成功后才更新偏移量,避免重復消費。
    from kafka import KafkaConsumer
    import jsondef create_consumer(group_id, topic):return KafkaConsumer(topic,bootstrap_servers='localhost:9092',group_id=group_id,value_deserializer=lambda m: json.loads(m.decode('utf-8')),enable_auto_commit=False  # 手動提交偏移量)consumer = create_consumer('order-service-group', 'order-events')
    
12.2 解決重復消費問題

重復消費問題通常是由于消費者宕機或網絡抖動導致的。解決重復消費問題的關鍵在于實現冪等性處理:

  • 業務層實現冪等性:通過消息的唯一 ID 做冪等判斷,確保每條消息只被處理一次。

    processed_events = set()def process_message(message):event_id = message['event_id']if event_id not in processed_events:# 處理消息print(f"Processing message: {message}")processed_events.add(event_id)else:print(f"Duplicate message: {message}")for message in consumer:process_message(message.value)
    
12.3 處理消息積壓

消息積壓通常是由于消費者處理速度慢導致的。解決消息積壓問題的關鍵在于優化消費者處理邏輯和增加消費者實例:

  • 優化消費者處理邏輯:提高消息處理速度,減少處理時間。

  • 增加消費者實例:通過增加消費者實例,實現消費并行,提升整體消費能力。

    from concurrent.futures import ThreadPoolExecutordef process_message(message):# 優化處理邏輯print(f"Processing message: {message}")def consume_events(consumer):with ThreadPoolExecutor(max_workers=10) as executor:for message in consumer:executor.submit(process_message, message.value)consumer = create_consumer('order-service-group', 'order-events')
    consume_events(consumer)
    
12.4 保證消息順序

消息順序錯亂通常是由于消息在不同分區間傳遞導致的。解決消息順序問題的關鍵在于使用業務實體 ID 作為 key,確保同一分區:

  • 生產者發送消息時使用業務實體 ID 作為 key:保證同一業務實體的消息發送到同一分區,從而保證順序。

    def send_event(producer, topic, key, event):try:future = producer.send(topic, key=key.encode('utf-8'), value=event)result = future.get(timeout=10)  # 異步發送print(f"Message sent to {result.topic} partition {result.partition} offset {result.offset}")except Exception as e:print(f"Failed to send message: {e}")event = {'event_type': 'order_created', 'order_id': '12345', 'timestamp': '2023-10-01T12:00:00Z'}
    send_event(producer, 'order-events', 'order_id_12345', event)
    
12.5 死信隊列設計

死信隊列用于存儲處理失敗的消息,方便后續分析和處理:

  • 消費失敗超過一定次數,將消息發送到死信主題:專門的死信處理服務進行補償處理。

    def handle_failed_message(message):producer.send('dead-letter-queue', value=message)def consume_events(consumer):for message in consumer:try:process_message(message.value)consumer.commit()  # 手動提交偏移量except Exception as e:print(f"Failed to process message: {e}")handle_failed_message(message.value)consumer = create_consumer('order-service-group', 'order-events')
    consume_events(consumer)
    
12.6 網絡和集群故障處理

網絡抖動或Kafka集群故障可能導致消息傳遞失敗。解決網絡和集群故障問題的關鍵在于配置合理的重試策略和監控Kafka集群健康:

  • 生產者和消費者配置合理的重試策略:確保在網絡抖動或集群故障時能夠自動重試。

  • 監控Kafka集群健康:使用監控工具及時發現并處理異常情況。

    producer = KafkaProducer(bootstrap_servers='localhost:9092',retries=5,acks='all'
    )# Prometheus 配置示例
    global:scrape_interval: 15sscrape_configs:- job_name: 'kafka'static_configs:- targets: ['localhost:9092']
    
12.7 消息格式兼容性

數據格式不一致或兼容性問題可能導致不同版本的消費者無法處理消息。解決消息格式兼容性問題的關鍵在于使用統一的消息格式和版本控制:

  • 使用統一的消息格式(如 Avro、Protobuf):確保消息格式的一致性。

  • 版本控制:確保新版本的消費者能夠兼容舊版本的消息格式。

    from confluent_kafka import avroschema_registry = avro.SchemaRegistryClient({'url': 'http://localhost:8081'})schema_str = """
    {"type": "record","name": "OrderEvent","fields": [{"name": "event_type", "type": "string"},{"name": "event_id", "type": "string"},{"name": "timestamp", "type": "string"},{"name": "order_id", "type": "string"}]
    }
    """schema = avro.loads(schema_str)
    

十三、總結

通過合理的主題設計、生產者和消費者配置、容錯機制和擴展能力,我們在物流系統中成功應用了Kafka,實現了各業務模塊的異步解耦和高效協同。在使用過程中,我們不斷優化Kafka的配置和使用策略,解決了常見問題,提升了系統的穩定性和性能。

希望本文的分享能為其他使用Kafka的團隊提供一些參考和借鑒。如果你有任何問題或建議,歡迎與我交流。通過這些詳細的解釋和代碼示例,我們可以更好地理解和應用Kafka,以支持復雜的物流系統需求。


通過這些優化,你的博客將更具結構性和可讀性,幫助讀者更好地理解和應用Kafka。希望這些建議對你有所幫助!

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

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

相關文章

Rust中模式匹配let Some(gas_price) = tx.gas_price用法

你問得非常好&#xff0c;let Some(gas_price) tx.gas_price 是 Rust 中的一種模式匹配寫法&#xff0c;它用于從 Option 類型中提取值。 ? 背景知識&#xff1a;什么是 Option&#xff1f; 在 Rust 中&#xff0c;如果一個值可能存在也可能不存在&#xff0c;就會用 Option…

什么是LLM大語言模型

什么是LLM大語言模型 LLM的全稱是&#xff0c;Large Language Model&#xff0c;簡稱LLM&#xff0c;翻譯為大語言模型&#xff0c;其核心是模擬人類語言的復雜規律&#xff0c;實現語義理解、推理分析、文本生成等任務&#xff0c;主要目的是實現能讀懂和說出人類語言的模型。…

雜談-架構時代演進

關于未來 5-10 年軟件系統演化方向 1. 云原生 ? 超云原生&#xff08;Post Cloud Native&#xff09; Kubernetes 平臺自治化&#xff1a; K8s Operator 日益強大&#xff0c;逐步具備自愈、自動擴縮容、自動調優能力。 云廠商與企業私有云逐步融合為一體…

如何查看服務器的運行日志?

&#x1f7e2; 一、Linux服務器 Linux日志都在**/var/log**目錄下&#xff0c;最常用的有&#xff1a; &#x1f4c2; 常用日志文件 文件內容/var/log/messages大部分系統日志&#xff08;CentOS常見&#xff09;/var/log/syslog系統消息日志&#xff08;Ubuntu/Debian常見&a…

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫 編譯環境&#xff1a; RV1106G3 Linux luckfox-rv1106 5.10.160 #3 Fri Jun 27 14:16:20 AWST 2025 armv7l GNU/Linux BusyBox v1.36.1 gcc version 14.2.0 (GCC) GNU ld (GNU Binutils) 2.44 GNU Make 4.4 n…

Go語言中map[string]interface{} 和 map[string]string的區別

在 Go 語言中&#xff0c;map[string]interface{} 和 map[string]string 是兩種不同類型的 map&#xff0c;它們的主要區別在于值的類型以及這種差異帶來的使用場景和靈活性的不同。 1. 值的類型 map[string]interface{}&#xff1a;這里的 interface{} 表示 Go 中的空接口類型…

AdGuard Home 安裝及使用

AdGuard Home 是 AdGuard 開源的一個私人 DNS 服務端,只需在網關部署,即可實現全局域網的廣告攔截與隱私反追蹤。在 DNS 解析的過程中,匹配規則庫內的 URL 進行攔截,同時在客戶端中,還可以通過自定義過濾規則實現網頁 DOM 的攔截。 基于 Golang 編寫的 AdGuard Home,官方…

繞過 GraphQL 暴力破解保護

題目要求&#xff1a; 本實驗的用戶登錄機制由 GraphQL API 提供支持。API 終端節點有一個速率限制器&#xff0c;如果它在短時間內收到來自同一源的太多請求&#xff0c;則會返回錯誤。 要解決實驗問題&#xff0c;請暴力破解登錄機制以 .使用身份驗證實驗室密碼列表作為密碼…

C/C++ 使用rapidjson庫 操作Json格式文件(創建、插入、解析、修改、刪除)

目錄 一、前言 1.簡介 2.兼容性 3.下載 4.安裝 5.官方文檔 6.自述 二、封裝Json 1. 創建一個 Document 對象 2. "key":"value" 3. { } 4. [ ] 5. [ { }, { } ] 6. [ [ ], [ ] ] 7. { [ ], [ ] } 8. { { }, { } } 9. 將Document轉換為字符串…

免安裝一鍵修復網絡診斷 + 權限修復!打印機共享錯誤工具適配 Win7/10/11

各位打印小能手們&#xff01;你們有沒有遇到過共享打印機出問題&#xff0c;搞得自己焦頭爛額的情況&#xff1f;比如系統一更新&#xff0c;打印機就連不上&#xff0c;打印任務失敗&#xff0c;真的是讓人崩潰啊&#xff01;別慌&#xff0c;今天就給大家全面介紹一款打印機…

電腦分屏快捷鍵5

按window右箭頭&#xff1a; 按window左箭頭&#xff1a;

nt!CcFlushCache函數分析之nt!CcFindBcb

nt!CcFindBcb函數分析 第一部分&#xff1a; 1: kd> p nt!CcAcquireByteRangeForWrite0x377: 80a13c49 e866e4ffff call nt!CcFindBcb (80a120b4) 1: kd> t nt!CcFindBcb: 80a120b4 55 push ebp 1: kd> kc # 00 nt!CcFindBcb 01 nt!CcAcqu…

矩陣及矩陣快速冪

一.矩陣與模板 【模板】矩陣求和 時間限制&#xff1a;1秒 內存限制&#xff1a;128M 題目描述 給出兩個&#x1d45b;行&#x1d45a;列的矩陣&#xff0c;求兩個矩陣的和 輸入描述 第一行輸入兩個以空格分隔的整數&#x1d45b;,&#x1d45a;&#xff0c;表示矩…

rk3588獲取探維雷達數據

可以在上期部署完 FASTLIO 的工作空間內&#xff0c;繼續部署探維雷達的驅動程序。不要問為什么不用 mid360&#xff0c;因為我手上只有探維雷達。 探維雷達的驅動鏈接&#xff1a;https://github.com/TanwayLab/tanwaylidar_view/blob/main/README.md 下載驅動并編譯 因為沿…

HTML簡介,初步了解HTML

<html> <body> <h1>我的第一個標題</h1> <p1>我的第一個段落</p1> </body> </html> 什么是HTML HTML是用來描述網頁的一種語言。 HTML指的是超文本標記語言。 HTML不是一種編程語言&#xff0c;而是一種標記語言。 標記語…

ARM集群服務器 定義

ARM集群服務器的核心定義可歸納為以下要點&#xff1a; 一、核心定義 ARM集群服務器是將?多個基于ARM架構的處理器節點?集成在單一物理機箱內&#xff0c;通過高速網絡互聯形成的分布式計算系統。每個節點均具備獨立的計算單元&#xff08;如CPU、GPU/NPU&#xff09;、內存…

進程和線程的區別?

進程&#xff08;Process&#xff09;和線程&#xff08;Thread&#xff09;是操作系統資源分配和調度的核心概念&#xff0c;它們的區別主要體現在以下幾個方面&#xff1a; 1. ??定義與資源分配?? ??進程?? 是程序的??一次執行實例??&#xff0c;擁有獨立的地址空…

AR 學習:開啟未來學習新視界?

AR 學習&#xff0c;即增強現實學習&#xff0c;是一種創新的學習方式&#xff0c;它巧妙地將增強現實技術融入到教育領域。簡單來說&#xff0c;就是利用 AR 技術把虛擬的信息和現實場景完美融合&#xff0c;為學習者打造出一個沉浸式的學習環境。AR 學習打破了傳統學習的邊界…

C++并發編程-4.unique_lock,共享鎖和遞歸鎖

本文介紹C 并發中使用的其他類型的鎖&#xff0c;包括unique_lock&#xff0c;shared_lock, 以及recursive_lock等。shared_lock和unique_lock比較常用&#xff0c;而recursive_lock用的不多&#xff0c;或盡可能規避用這種鎖。 unique_lock unique_lock和lock_guard基本用法…

stm32 freertos下基于 hal庫的模擬I2C驅動實現

一 前言 最近搞了兩個項目&#xff0c;調了一版freertos下基于hal庫得模擬I2C驅動&#xff0c;非常實用&#xff0c;直接拷貝就能用&#xff0c;這里做下記錄&#xff0c;主要用到如下四個文件&#xff1a; delay.cdelay.hi2cc.ci2cc.h 二 代碼實現 delay.c #include "…