海量聊天消息處理:ShardingJDBC分庫分表、ClickHouse冷熱數據分離、ES復合查詢方案、Flink實時計算與SpringCloud集成

海量聊天消息處理:ShardingJDBC分庫分表、ClickHouse冷熱數據分離、ES復合查詢方案、Flink實時計算與SpringCloud集成

一、背景介紹

每天有2000萬條聊天消息,一年下來幾千萬億海量數據。為應對這種規模的數據存儲和處理需求,本文將從以下幾個方面提供解決方案:

  • 使用ShardingJDBC技術進行合理的分庫分表策略存放MySQL。
  • 結合大數據同步ClickHouse實現冷熱數據分離。
  • 結合ElasticSearch提供多種復合查詢方案。
  • 結合Flink進行實時計算并提供代碼示例。
  • 結合SpringCloud給出集成方案并提供代碼示例。

二、ShardingJDBC分庫分表策略

1. 分庫分表策略

假設我們有以下的業務場景:

  • 每天新增2000萬條聊天記錄。
  • 每張表存儲約500萬條數據。
  • 每個數據庫最多存儲4張表。

基于此,我們可以設計如下的分庫分表策略:

// 每個數據庫包含4張表
// 數據庫名:chat_db_0, chat_db_1, ..., chat_db_n
// 表名:chat_message_0, chat_message_1, ..., chat_message_3// 分庫規則:根據用戶ID的hash值對數據庫數量取模
// 分表規則:根據時間戳對表數量取模

2. 建表語句

CREATE TABLE `chat_message` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',`user_id` BIGINT(20) NOT NULL COMMENT '用戶ID',`message` VARCHAR(500) NOT NULL COMMENT '消息內容',`send_time` DATETIME NOT NULL COMMENT '發送時間',PRIMARY KEY (`id`),UNIQUE KEY `uk_user_send_time` (`user_id`, `send_time`),INDEX `idx_send_time` (`send_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='聊天消息表';// 分區配置
ALTER TABLE `chat_message`
PARTITION BY RANGE (YEAR(send_time)) (PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025),PARTITION p2025 VALUES LESS THAN (2026)
);

三、ClickHouse冷熱數據分離

為了實現冷熱數據分離,我們可以將最近7天內的數據定義為熱數據,存儲在內存中;超過7天的數據定義為冷數據,存儲在磁盤中。

// ClickHouse建表語句
CREATE TABLE chat_message_clickhouse
(id UInt64,user_id UInt64,message String,send_time DateTime
) ENGINE = MergeTree()
ORDER BY (user_id, send_time)
PARTITION BY toYYYYMM(send_time);// 冷熱數據分離策略
// 使用ReplicatedMergeTree引擎,將熱數據存儲在內存中,冷數據存儲在磁盤上。

四、ES復合查詢方案

以下是幾種復合查詢方案:

1. Bool Query

{"query": {"bool": {"must": [{ "match": { "message": "hello" } },{ "range": { "send_time": { "gte": "now-7d/d", "lte": "now/d" } } }]}}
}

2. Nested Query

{"query": {"nested": {"path": "user","query": {"bool": {"must": [{ "match": { "user.name": "John" } },{ "range": { "user.age": { "gte": 18 } } }]}}}}
}

五、Flink實時計算方案

1. 實時計算代碼示例

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;public class ChatMessageProcessor {public static void main(String[] args) throws Exception {// 創建執行環境final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 讀取聊天消息流DataStreaminputStream = env.socketTextStream("localhost", 9999);// 實時處理聊天消息DataStreamprocessedStream = inputStream.map(new MapFunction() {@Overridepublic String map(String value) throws Exception {return "Processed: " + value;}});// 輸出處理結果processedStream.print();// 啟動任務env.execute("Chat Message Processor");}
}

六、SpringCloud集成方案

1. SpringCloud集成代碼示例

@SpringBootApplication
@EnableDiscoveryClient
public class ChatServiceApplication {public static void main(String[] args) {SpringApplication.run(ChatServiceApplication.class, args);}
}@RestController
@RequestMapping("/chat")
public class ChatController {@GetMapping("/message")public String getMessage() {return "Hello, this is a chat message!";}
}

七、Nacos配置方案

# application.yml
spring:cloud:nacos:discovery:server-addr: localhost:8848config:server-addr: localhost:8848file-extension: yaml

八、Maven依賴

org.apache.shardingspheresharding-jdbc-core4.1.1mysqlmysql-connector-java8.0.26ru.yandex.clickhouseclickhouse-jdbc0.3.2org.elasticsearch.clientelasticsearch-rest-high-level-client7.10.2org.apache.flinkflink-streaming-java_2.111.12.0org.springframework.cloudspring-cloud-starter-netflix-eureka-client2.2.5.RELEASEcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery2.2.3.RELEASE

九、總結

本文詳細介紹了如何使用ShardingJDBC進行分庫分表、ClickHouse冷熱數據分離、Elasticsearch復合查詢、Flink實時計算以及SpringCloud集成等技術來處理海量聊天消息數據。希望這些方案能為你的項目提供參考。

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

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

相關文章

Vim 中替換字符或文本

在 Vim 中替換字符或文本可以使用 替換命令(substitute),其基本語法為: :[range]s/old/new/[flags]1. 基本替換 命令說明:s/foo/bar/替換當前行的第一個 foo 為 bar:s/foo/bar/g替換當前行的 所有 foo 為 bar:%s/foo/bar/g替換 …

當傳統美術館遇上數字革命:觀眾體驗將迎來哪些顛覆性變革?

當數字科技與藝術創作深度交織,美術館與藝術機構正經歷前所未有的顛覆性浪潮。這是否宣告傳統展覽空間已正式跨入數字媒介主導的新紀元?投影映射與虛擬現實技術不斷突破物理限制,畫布與雕塑的邊界在光影與代碼中逐漸消融。這場革命不僅重構了…

內容/社區APP增長:用Deeplink讓用戶分享的內容“一鍵直達”

對于內容平臺和互動社區APP而言,優質內容的自發傳播是用戶增長和活躍度提升的核心驅動力之一。用戶發現一篇深度好文、一個精彩視頻或是一個引人入勝的討論帖,自然而然地想要分享給好友。然而,這個看似簡單的分享動作,卻往往在觸達…

Uniapp:vite.config.js全局配置

目錄 一、基本概述二、配置自動引入插件一、基本概述 vite.config.js 是一個可選的配置文件,如果項目的根目錄中存在這個文件,那么它會被自動加載,一般用于配置 vite 的編譯選項 二、配置自動引入插件 在項目命令行終端中執行如下代碼 npm install unplugin-auto-import…

JavaScript 與 Java 學習筆記

一、JavaScript 簡介 1. 定義 瀏覽器腳本語言:主要用于實現網頁交互功能(鼠標點擊、鍵盤輸入響應等) 服務器端擴展:通過 Node.js 運行時環境可進行后端開發 2. 核心特點 動態性:可實時修改 DOM 結構(增…

Shell腳本-隨機數實戰案例

在Shell腳本編程中,生成隨機數是一項非常實用的技能。無論是用于模擬、測試、游戲開發還是安全相關的應用(如生成密碼),能夠靈活地生成隨機數都是非常有用的。本文將通過幾個實際的應用案例來展示如何在Shell腳本中使用隨機數解決…

面試算法高頻08-動態規劃-03

練習題 題目描述 你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。 給定一個代表每…

基于 EFISH-SBC-RK3588 的無人機多光譜/紅外熱成像邊緣計算方案

一、硬件架構設計? ?核心算力平臺(EFISH-SBC-RK3588)? ?處理器性能?:搭載 8 核 ARM 架構(4Cortex-A762.4GHz 4Cortex-A551.8GHz),集成 6 TOPS NPU 與 Mali-G610 GPU,支持多光譜圖像實時融…

Python小酷庫系列:pyNest,把FastAPI程序寫出Spring的味道

pyNest,把FastAPI程序寫出Spring的風格 快速入門1、安裝pyNest2、創建項目3、編寫app_module.py4、編寫app_service.py5、編寫app_controller.py6、編寫main.py7、啟動程序 核心概念1、Modules2、Controllers3、Providers4、ORM Provider NestJS是風靡于Node.js圈的…

HTML 詳解:從基礎結構到語義標簽

目錄 一、HTML 是什么&#xff1f;二、HTML 的基本結構? 簡要說明&#xff1a; 三、常見 HTML 標簽講解3.1 標題標簽 <h1> ~ <h6>3.2 段落和換行3.3 超鏈接3.4 圖像插入3.5 列表無序列表&#xff1a;有序列表&#xff1a; 3.6 表格結構 四、HTML 語義化標簽詳解五…

用Python做有趣的AI項目 6:AI音樂生成器(LSTM Melody Generator)

&#x1f3b5; 項目名稱&#xff1a;AI音樂生成器&#xff08;LSTM Melody Generator&#xff09; &#x1f9e0; 項目簡介 這個項目的目標是&#xff1a;用 AI 來自動生成簡單的旋律&#xff08;MIDI格式&#xff09;&#xff0c;類似于基礎的鋼琴曲、背景音樂片段。 我們使…

【運維】利用任務計劃程序定時重啟 nssm 服務 | Windows 服務每日定時維護實踐

&#x1f680; 利用任務計劃程序定時重啟 nssm 服務 | Windows 服務每日定時維護實踐 一、前言 在 Windows 系統中&#xff0c;nssm&#xff08;Non-Sucking Service Manager&#xff09; 是一個非常好用的工具&#xff0c;可以將任意可執行程序注冊為系統服務。很多運維場景…

MATLAB小試牛刀系列(1)

問題描述 某機床廠生產甲、乙兩種機床&#xff0c;每臺機床銷售后的利潤分別為 4 千元與 3 千元。生產甲機床需用 A、B 機器加工&#xff0c;加工時間分別為每臺 2h 和每臺 1h&#xff1b;生產乙機床需用 A、B、C 三種機器加工&#xff0c;加工時間均為每臺 1h。若每天可用于加…

云原生周刊:Kubernetes v1.33 正式發布

開源項目推薦 Robusta Robusta 是一個開源的 K8s 可觀測性與自動化平臺&#xff0c;旨在增強 Prometheus 告警的智能化處理能力。它通過規則和 AI 技術對告警進行豐富化處理&#xff0c;自動附加相關的 Pod 日志、圖表和可能的修復建議&#xff0c;支持智能分組、自動修復和高…

React速通筆記

相關視頻&#xff1a; 黑馬程序員前端React18入門到實戰視頻教程&#xff0c;從reacthooks核心基礎到企業級項目開發實戰&#xff08;B站評論、極客園項目等&#xff09;及大廠面試全通關_嗶哩嗶哩_bilibili 一、React介紹 React由Meta公司開發&#xff0c;是一個用于 構建W…

人工智能與機器學習:Python從零實現K-Means 算法

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

【神經網絡與深度學習】訓練集與驗證集的功能解析與差異探究

引言 在深度學習模型的訓練過程中&#xff0c;訓練集和驗證集是兩個關鍵組成部分&#xff0c;它們在模型性能的提升和評估中扮演著不可替代的角色。通過分析這兩者的區別和作用&#xff0c;可以幫助我們深入理解模型的學習過程和泛化能力&#xff0c;同時為防止過擬合及優化超…

Macos m系列芯片環境下python3安裝mysqlclient系列問題

最近學習python3&#xff0c;在安裝mysqlclient的時候遇到了一些問題&#xff0c;直接使用哦pip install mysqlclient 直接報錯了&#xff0c;記錄一下解決方案。 環境信息 設備&#xff1a;Macbook Pro m1 系統&#xff1a;macos Sequoia 15.3.2 最終成功的python版本&#xf…

微信小程序-van-uploader的preview-size

preview-size支持數組格式 修改前修改后1、升級微信小程序里面的van版本:2、 重新構建npm3、重啟微信開發工具 修改前 引用van組件的上傳文件&#xff0c;設置預覽圖尺寸&#xff0c;剛開始設置的是preview-size“140”&#xff0c;出來的效果就是一個正方形。 修改后 1、升級…

2. 第一個網頁:前端基礎入門

第一個網頁&#xff1a;前端基礎入門 一、網頁文件基礎認知 1. 文件擴展名 .htm 或 .html 均為網頁文件后綴&#xff0c;二者功能完全一致擴展名隱藏方法 系統設置 → 文件夾選項 → 查看 → 取消勾選「隱藏已知文件類型的擴展名」 二、前端發展簡史 1. 瀏覽器戰爭與標準混…