最近項目上因為遇到數據量過大導致查詢統計性能問題(oracle數據庫、單表每月1億多條車輛定位記錄,由一個windows環境下的鏈路服務程序來接收車輛上傳的定位數據寫入oracle),急需使用大數據架構來解決。前期同事已經提出整體解決思路(修改鏈路服務程序,在寫oracle的基礎上同時寫入kafka,之后再用etl工具從kafka保存到hive下)並從技術上初步驗證了hive的性能。現在進入工程實操環節,我們需要解決的第一個問題就是先實現鏈路服務程序,作為kafka的producer產生消息寫入kafka。
由於這個鏈路服務程序是c#寫的,所以我們需要Confluent.Kafka來實現對kafka的操作。為了驗證技術可走通,先做一個測試工程:
通過nuget引入 Confluent.Kafka,當前是1.5.0的版本,需要對應的framework版本是4.5。brokerlist是kafka的對外服務地址,topic是kafka上創建的主題(類比理解的話,kafka的主題就相當於是傳統數據庫的表,它把一類消息放在一個主題下,主題下可以有多個分區)。
測試代碼很簡單,兩個按鈕,一個按鈕開始測試,構建消息、發送消息;一個按鈕停止發送消息:
說一下我們遇到的坑:
測試程序在kafka所在機器上運行很正常,通過命令行可以正常看到發送過來的測試數據。但是當我們在正式服務器上測試的時候(測試程序與kafka服務不在一起,分別在兩台服務器上),卻死活發送不成功,報超時錯誤:Local:Message timed out
剛開始一頭霧水,搞防火牆、重啟kafka、修改hosts等等各種配置不好使。后來搜到網上有帖子說,需要配置一下advertised.listeners 詳見: https://www.cnblogs.com/wangxinblog/p/7623419.html 配置完成后,消息發送成功!