海量聊天消息处理: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.mzph.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. 浏览器战争与标准混…