主頁 >  其他 > 聊聊 Kafka:如何避免消費組的 Rebalance

聊聊 Kafka:如何避免消費組的 Rebalance

2022-01-18 07:58:22 其他

一、前言

我們上一篇聊了 Rebalance 機制,相信你對消費組的重平衡有個整體的認識,這里再簡單回顧一下,Rebalance 就是讓一個 Consumer Group 下所有的 Consumer 實體就如何消費訂閱主題的所有磁區達成共識的程序,在 Rebalance 程序中,Consumer Group 下所有的 Consumer 實體共同參與,在 Coordinator 協調者組件的幫助下,完成訂閱主題磁區的分配,但是,在整個程序中,所有實體都不能消費任何訊息,因此它對 Consumer 的 TPS 影響很大,像不像 JVM 的 GC?我們知道 JVM 頻繁 GC 的話,對時延敏感的業務來說,簡直是噩夢,所以我們會針對 GC 進行相應的調優,讓 JVM 不那么頻繁的發生 STW,

Kafka 消費組的重平衡也是類似的,消費組發生重平衡,Consumer 就很慢,對于實時性不敏感的業務,慢一點也能接受,就怕 Consumer 處理業務超時了,消費組把 Consumer 踢出去了,業務設定重試機制,自動從執行緒池中拿出一個新執行緒作為消費者去訂閱 topic,那么意味著有新消費者加入 Consumer Group,又會引發 Rebalance,新的消費者還是來不及處理完所有訊息,又被移出 Consumer Group,如此回圈,就發生了頻繁的 Rebalance 現象,

二、Rebalance 的弊端

  • Rebalance 影響 Consumer 端 TPS,Coordinator 協調者組件完成訂閱主題磁區的分配的程序,該消費組下所有實體都不能消費任何訊息,
  • 如果你的組成員消費者實體很多的話,Rebalance 很慢,對業務會造成一定的影響,
  • Rebalance 效率不高,當前 Kafka 的設計機制決定了每次 Rebalance 時,Consumer Group 下的所有成員都要參與進來,而且通常不會考慮區域性原理,但區域性原理對提升系統性能是特別重要的,

對于第三點,你是不是覺得,Kafka 社區讓所有成員都要參與進來很不合理啊,應該把那個退出消費組的消費者負責的磁區隨機分配給其它消費者,其它消費者的磁區分配策略不變,這樣就最大限度地減少 Rebalance 對剩余 Consumer 成員的沖擊,

沒錯,你想到的社區也想到了,社區于 0.11.0.0 版本推出了 StickyAssignor,即有粘性的磁區分配策略,所謂的有粘性,是指每次 Rebalance 時,該策略會盡可能地保留之前的分配方案,盡量實作磁區分配的最小變動,不過有些遺憾的是,這個策略目前還有一些 bug,而且需要升級到 0.11.0.0 才能使用,因此在實際生產環境中用得還不是很多,

你可能會問了,社區對上面的弊端有沒有什么解決辦法?沒有,特別是 Rebalance 慢這個問題,Kafka 社區對此無能為力,設計就是這樣的話,那我們是不是可以盡可能去規避 Rebalance 呢,特別是那些不必要的 Rebalance,

三、觸發 Rebalance 機制的時機

要避免 Rebalance,還是要從觸發 Rebalance 機制的時機入手,我們在前面說過,觸發 Rebalance 機制的時機主要有以下幾個:

  • 有新的 Consumer 加入 Consumer Group
  • 有 Consumer 宕機下線,Consumer 并不一定需要真正下線,例如遇到長時間的 GC、網路延遲導致消費者長時間未向 GroupCoordinator 發送 HeartbeatRequest 時,GroupCoordinator 會認為 Consumer 下線,
  • 有 Consumer 主動退出 Consumer Group(發送 LeaveGroupRequest 請求),比如客戶端呼叫了 unsubscribe() 方法取消對某些主題的訂閱,
  • Consumer 消費超時,沒有在指定時間內提交 offset 偏移量,
  • Consumer Group 所對應的 GroupCoordinator 節點發生了變更,
  • Consumer Group 所訂閱的任一主題或者主題的磁區數量發生變化,

四、Rebalance 實戰

有點抽象是不是?沒有關系,下面來看個例子,老周簡單來模擬一下 Rebalance,

4.1 生產者

/**
 * @author: 微信公眾號【老周聊架構】
 */
public class KafkaProducerRebalanceTest {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

        KafkaProducer<String,String> producer = new KafkaProducer<>(props);
        for (int i = 0; i < 10; i++) {
            ProducerRecord record = new ProducerRecord<>("topic_test", "userName", "riemann_" + i);
            producer.send(record);
        }
        producer.close();
    }
}

4.2 消費者

/**
 * @author: 微信公眾號【老周聊架構】
 */
public class KafkaConsumerRebalanceTest {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "consumer_group_test");
        props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "10000");
        props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, "60000");

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        String topic = "topic_test";
        long pollTimeout = 100;
        long sleep = TimeUnit.MILLISECONDS.convert(2, TimeUnit.MINUTES);

        consumer.subscribe(Arrays.asList(topic), new ConsumerRebalanceListener() {
            @Override
            public void onPartitionsRevoked(Collection<TopicPartition> collection) {
                System.out.println("Partition Revoked");
            }

            @Override
            public void onPartitionsAssigned(Collection<TopicPartition> collection) {
                System.out.println("New assignment : " + collection.size() + " partitions");
            }
        });

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(pollTimeout));
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s \n", record.offset(), record.key(), record.value());
                try {
                    Thread.sleep(sleep);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4.3 終端日志

消費者日志

[Consumer clientId=consumer-consumer_group_test-1, groupId=consumer_group_test] Member consumer-consumer_group_test-1-7d64e140-f0e3-49d2-8230-2621ba1d2061 sending LeaveGroup request to coordinator 127.0.0.1:9092 (id: 2147483643 rack: null) due to consumer poll timeout has expired. This means the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time processing messages. You can address this either by increasing max.poll.interval.ms or by reducing the maximum size of batches returned in poll() with max.poll.records. (org.apache.kafka.clients.consumer.internals.AbstractCoordinator)

在這里插入圖片描述
服務端日志

[2022-01-16 16:38:25,315] INFO [GroupCoordinator 4]: Member[group.instance.id None, member.id consumer-consumer_group_test-1-7d64e140-f0e3-49d2-8230-2621ba1d2061] in group consumer_group_test has left, removing it from the group (kafka.coordinator.group.GroupCoordinator)
[2022-01-16 16:38:25,315] INFO [GroupCoordinator 4]: Preparing to rebalance group consumer_group_test in state PreparingRebalance with old generation 37 (__consumer_offsets-17) (reason: removing member consumer-consumer_group_test-1-7d64e140-f0e3-49d2-8230-2621ba1d2061 on LeaveGroup) (kafka.coordinator.group.GroupCoordinator)
[2022-01-16 16:38:25,316] INFO [GroupCoordinator 4]: Group consumer_group_test with generation 38 is now empty (__consumer_offsets-17) (kafka.coordinator.group.GroupCoordinator)

在這里插入圖片描述
那消費組為啥會出現 Rebalance 呢?從消費者日志可以看出,消費超時,導致消費執行緒長時間無法向 Coordinator 節點發送心跳,Coordinator 節點以為 Consumer 已經宕機,Coordinator 于是將 Consumer 節點從消費組中剔除,并觸發了 Rebalance 機制,

這其實和 Consumer 的心跳發送機制也有關系,在大多數中間件的設計中,都會分離業務執行緒和心跳發送執行緒,而 Kafka 卻沒有這樣做,其目的可能是為了實作簡單,如果消費者消費業務確實需要非常長時間,我們可以通過引數 max.poll.interval.ms 配置,它代表消費兩次 poll 最大的時間間隔,默認是 300000 ms,也就是 5 分鐘,5 分鐘都還超時,那可以再調大一點;或者我們可以減少 consumer 每次從 broker 拉取的資料量,可以通過引數 max.poll.records 配置,consumer 默認拉取 500 條,我們可以將其修改了 200 條,

Kafka 在 0.10.1 版本中修正了 Consumer 的心跳發送機制,將心跳發送的任務交給了專門的 HeartbeatThread,而不是像早期版本那樣依賴于用戶應用執行緒來定期輪詢,這個設計被證明是相當棘手的調整,增加會話超時將為訊息處理提供更多的時間,但消費者組也將花更多的時間來檢測行程崩潰等故障,Kafka 消費者 0.10.1 引入了 max.poll.interval.ms 來解耦處理超時和會話超時,這個 max.poll.interval.ms 引數還是很有意義的,因為即使心跳發送正常,那也只能證明 Consumer 是存活狀態,但是 Consumer 可能處于假死狀態,比如 Consumer 遇到了死鎖導致長時間等待超過了poll 設定的時間間隔 max.poll.interval.ms

五、Rebalance 問題處理思路

我們上面第三點說的觸發 Rebalance 機制的時機有好幾點,其實主要就三大類:

  • 組成員數量發生變化
  • 訂閱主題數量發生變化
  • 訂閱主題的磁區數發生變化

后面兩個通常都是運維的主動操作,所以它們引發的 Rebalance 大都是不可避免的,接下來,我們主要來說說不必要的 Rebalance 該如何避免,也就是組成員數量變化而引發的 Rebalance 該如何避免,

如果 Consumer Group 下的 Consumer 實體數量發生變化,就一定會引發 Rebalance,這是 Rebalance 發生的最常見的原因,

Consumer 實體增加的情況很好理解,當我們啟動一個配置有相同 group.id 值的 Consumer 程式時,實際上就向這個 Consumer Group 添加了一個新的 Consumer 實體,此時,Coordinator 會接納這個新實體,將其加入到組中,并重新分配磁區,通常來說,增加 Consumer 實體的操作都是計劃內的,可能是出于增加 TPS 或提高伸縮性的需要,總之,它不屬于我們要規避的那類 “不必要 Rebalance”,

我們更在意的是 Consumer Group 下實體數減少這件事,如果你就是要停掉某些 Consumer 實體,那自不必說,關鍵是在某些情況下,Consumer 實體會被 Coordinator 錯誤地認為 “已停止” 從而被 “踢出” Consumer Group,如果是這個原因導致的 Rebalance,我們就不能不管了,

Coordinator 會在什么情況下認為某個 Consumer 實體已掛從而要退組呢?那就要來看看消費者端配置的幾個引數:

  • session.timeout.ms 設定了超時時間
  • heartbeat.interval.ms 心跳時間間隔
  • max.poll.interval.ms 每次消費的處理時間
  • max.poll.records 每次消費的訊息數

5.1 session.timeout.ms

在這里插入圖片描述

Consumer 與 Broker 的心跳超時時間,默認 10s,Broker 如果超過 session.timeout.ms 設定的值仍然沒有收到心跳,Broker 端將會將該消費者移除,并觸發 Rebalance,

這個值必須設定在 Broker 配置中的 group.min.session.timeout.msgroup.max.session.timeout.ms 之間,

該引數和 heartbeat.interval.ms 這兩個引數可以適當的控制 Rebalance 的頻率,

5.2 heartbeat.interval.ms

在這里插入圖片描述

心跳間隔時間,心跳是在 Consumer 與 Coordinator 之間進行的,心跳用來保持 Consumer 的會話,并且在有 Consumer 加入或者離開 Consumer Group 時幫助進行 Rebalance,

這個值必須設定的小于 session.timeout.ms,因為:當 Consumer 由于某種原因不能發 Heartbeat 到 Coordinator 時,并且時間超過 session.timeout.ms 時,就會認為該 Consumer 已退出,它所訂閱的 Partition 會分配到同一 Consumer Group 內的其它的 Consumer 上,

通常設定的值要低于 session.timeout.ms1/3,默認值是:3s

5.3 max.poll.interval.ms

在這里插入圖片描述

兩次 poll 方法呼叫的最大間隔時間,單位毫秒,默認為 5 分鐘,如果消費端在該間隔內沒有發起 poll 操作,該消費者將被剔除,觸發重平衡,將該消費者分配的佇列分配給其他消費者,

Kafka 中有一個專門的心跳執行緒來實作發送心跳的動作,所以存在 Consumer Client 依舊可以有效的發送心跳,但 Consumer 實際卻處于 livelock (活鎖)狀態,從而導致無法有效的進行資料處理,所以基于此 Kafka 通過引數 max.poll.interval.ms 來規避該問題,

5.4 max.poll.records

在這里插入圖片描述

Consumer 每次呼叫 poll() 時取到的 records 的最大數,每執行一次 poll 方法所拉取的最大資料量;是基于所分配的所有 Partition 而言的資料總和,而非每個 Partition 上拉去的最大資料量;默認值為 500

通俗點講表示每次消費的時候,獲取多少條訊息,獲取的訊息條數越多,需要處理的時間越長,所以每次拉取的訊息數不能太多,需要保證在 max.poll.interval.ms 設定的時間內能消費完,否則會發生 rebalance,

六、如何避免 Rebalance

簡單來說,非必要 Rebalance 有下面兩個點:

  • 消費者心跳超時,導致 Rebalance,
  • 消費者處理時間過長,導致 Rebalance,

6.1 消費者心跳超時

我們知道消費者是通過心跳和協調者保持通訊的,如果協調者收不到心跳,那么協調者會認為這個消費者死亡了,從而發起 Rebalance,

這里給一下業界主流推薦的值,可以根據自己的業務可做相應的調整:

  • 設定 session.timeout.ms = 6s
  • 設定 heartbeat.interval.ms = 2s
  • 要保證 Consumer 實體在被判定為 “dead” 之前,能夠發送至少 3 輪的心跳請求,即 session.timeout.ms >= 3 * heartbeat.interval.ms

這里你可能會問了,為啥要 session.timeout.ms >= 3 * heartbeat.interval.ms,而不是 5 或者 10 呢?

session.timeout.ms 是個"邏輯"指標,比如它指定了一個閾值 6 秒,在這個閾值內如果 Coordinator 未收到 Consumer 的任何訊息,那 Coordinator 就認為 Consumer 掛了,而 heartbeat.interval.ms 是個"物理"指標,它告訴 Consumer 要每 2 秒給 Coordinator 發一個心跳包,heartbeat.interval.ms 越小,發的心跳包越多,它是會影響發 TCP 包的數量的,產生了實際的影響,這也是我為什么將之稱為"物理"指標的原因,

如果 Coordinator 在一個 heartbeat.interval.ms 周期內未收到 Consumer 的心跳,就把該 Consumer 移出 Consumer Group,這有點說不過去,就好像 Consumer 犯了一個小錯,就一棍子把它打死了,事實上,有可能網路延時,有可能 Consumer 出現了一次長時間 GC,影響了心跳包的到達,說不定下一個 Heartbeat 就正常了,

heartbeat.interval.ms 肯定是要小于 session.timeout.ms 的,如果 Consumer Group 發生了 Rebalance,通過心跳包里面的 REBALANCE_IN_PROGRESS,Consumer 就能及時知道發生了 Rebalance,從而更新 Consumer 可消費的磁區,而如果超過了 session.timeout.ms,Coordinator 都認為 Consumer 掛了,那也當然不用把 Rebalance 資訊告訴該 Consumer 了,

Kafka 0.10.1 之后的版本中,將 session.timeout.msmax.poll.interval.ms 解耦了,也就是說:new KafkaConsumer 物件后,在 while true 回圈中執行 consumer.poll 拉取訊息這個程序中,其實背后是有 2 個執行緒的,即一個 Consumer 實體包含 2 個執行緒:一個是 Heartbeat 執行緒,另一個是 Processing 執行緒,Processing 執行緒可理解為呼叫 consumer.poll 方法執行訊息處理邏輯的執行緒,而 Heartbeat 執行緒是一個后臺執行緒,對程式員是"隱藏不見"的,如果訊息處理邏輯很復雜,比如說需要處理 5 min,那么 max.poll.interval.ms 可設定成比 5 min 大一點的值,而 Heartbeat 執行緒則和上面提到的引數 heartbeat.interval.ms 有關,Heartbeat 執行緒每隔 heartbeat.interval.ms 向 Coordinator 發送一個心跳包,證明自己還活著,只要 Heartbeat 執行緒 在 session.timeout.ms 時間內向 Coordinator 發送過心跳包,那么 Coordinator 就認為當前的 Consumer 是活著的,

Kafka 0.10.1 之前,發送心跳包和訊息處理邏輯這 2 個程序是耦合在一起的,試想:如果一條訊息處理時長要 5 min,而 session.timeout.ms=3000ms,那么等 Consumer 處理完訊息,Coordinator 早就將 Consumer 移出 Consumer Group 了,因為只有一個執行緒,在訊息處理程序中就無法向 Coordinator 發送心跳包,超過 3000ms 未發送心跳包,Coordinator 就將該 Consumer 移出 Consumer Group 了,而將二者分開,一個 Processing 執行緒負責執行訊息處理邏輯,一個 Heartbeat 執行緒負責發送心跳包,那么就算一條訊息需要處理 5min,只要 Heartbeat 執行緒在 session.timeout.ms 時間內向 Coordinator 發送了心跳包,那 Consumer 可以繼續處理訊息,而不用擔心被移出 Consumer Group 了,另一個好處是:如果 Consumer 出了問題,那么在 session.timeout.ms 內就能檢測出來,而不用等到 max.poll.interval.ms 時長后才能檢測出來,

為啥要 session.timeout.ms >= 3 * heartbeat.interval.ms,我覺得是社區做的測驗得出來的最優值吧, 因為 heartbeat.interval.ms 越小,發的心跳包越頻繁,浪費沒必要的流量;而設定越大,Consumer 掛了很久才能檢測到,明顯也不合理,

6.2 消費者處理時間過長

如果消費者處理時間過長,那么同樣會導致協調者認為該 Consumer 死亡了,從而發起重平衡,

而 Kafka 的消費者引數設定中,跟消費處理的兩個引數為:

  • max.poll.interval.ms 每次消費的處理最大時間
  • max.poll.records 每次消費的訊息數

對于這種情況,一般來說就是增加消費者處理的時間(即提高 max.poll.interval.ms 的值),減少每次處理的訊息數(即減少 max.poll.records 的值),

我們上面的那個例子就是這個場景觸發的 Rebalance,max.poll.interval.ms 每次消費的處理最大時間設定的是 60000ms,也就是 1min,而我在 consumer.poll 方法里休眠了 2min 來模擬處理業務的時間,處理業務的時間大于 max.poll.interval.ms ,導致 Rebalance,

6.3 Consumer 端的 GC 表現

如果上面兩種從 Kafka 層面還無法避免 Rebalance,那我建議你去排查下 Consumer 端的 GC 表現,比如是否出現了頻繁的 Full GC 導致的長時間停頓,從而引發了 Rebalance,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413859.html

標籤:其他

上一篇:我在B站爆炸了

下一篇:2022DeepBrainChain雙周報第103期(01.01-01.15)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more