如何实现IM即时通信系统(一)

2023-11-09

在企业数字化建设过程中,如何与客户保持线上链接是重要的组成部分。而IM通信系统就属于数字化建设的基础设施。那么,如何实现一个符合企业需求的IM系统呢?采购当然是其中需要考虑的方式之一。但就我个人的经验来看,市面上好的IM厂商很稀少,因为IM厂商需要做标准化产品,所以如果公司的业务并不是传统意义上的社交IM业务。那么IM厂商提供的功能大部分用不到,并且对于群聊,单聊等基础功能还要做二次开发。

今天,我们并不讨论在什么情况下需要采购,什么情况下需要自研,等后面写产品思考类的文章时可以分享这些。现在我们只讨论一个话题,如何设计开发一个属于自己的IM系统?

首先,熟悉业务场景是架构设计的一部分,因为它决定了IM系统的功能范围。我们可以为这个IM定义某个业务场景:

客服网聊场景:

1,如果该用户有专属客服,则和专属客服进行会话 如果专属客服不在线,进入等待队列,等坐席应答;如果该用户为VIP,则可以进入优先级较高的等待队列。否则正常排队;

2,客服可以在线邀请投顾或者其他专家,进入服务客户的三方会话

3,自定义消息卡片:

支持注册绑卡/产品预约;

支持当前业务进度通知:“用户正在填写身份证”,“用户绑卡失败” ,

支持消息优先级,比如“用户支付失败”

支持进入场景提前通知:比如用户从某会议进入,用户从app端会议/直播/交易页面进入

4,超大群聊:可以支持3000人的聊天群(需要设计“读扩散”和“写扩散”问题的解决机制)

结合以上的场景,我们接下来可以定义我们的功能设计:

各业务根据分配到的appid接入IM服务 (前端SDK植入)

支持PC/H5/小程序通过websocket连接,APP通过socket连接

支持单聊/群聊/超大群(3000人)/聊天室

支持文本/图文/音视频/自定义消息

支持离线/历史消息存储

支持单聊转群聊场景

支持可集群部署,gRPC远程调用

应用架构设计:

首先,IM包括最基本的三个功能模块,分别是IM Server负责连接管理,IM Route负责路由管理,以及IM stroage负责消息存储管理。

从前面的场景中,我们也能发现在IM通信过程中,需要考虑两个最重要的ID的设计:用户id,群id。可以说这两个id在消息的分库分表,负载均衡,服务扩容,服务宕机等场景中都会起到很重要的作用。其中,我们考虑两个方面:

A,平衡性:每台服务器均匀处理请求

B,单调性:扩容或者宕机时,部分数据迁移即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现IM即时通信系统(一) 的相关文章

  • 如何通过 RPC 连接到 Hedera 测试网?​

    我无法通过 HTTP 连接到 Hedera Testnet RPC 端点 可靠地 我间歇性地收到以下 未知错误 Request ID fe7b9928 a23f 0d72 61a1 b7cd23658c01 Unknown error in
  • Web 服务代理中的 SSL 证书问题

    我正在构建一个 JAVA Web 服务客户端 在其中连接到服务 该服务具有 ssl 证书验证 如何使用 ssl 证书验证来调用此服务 我在使用 Eclipse 构建的客户端中使用 JAX RPC 实现 举个例子将不胜感激 我能够进行网络服务
  • AI分布式训练:DDP (数据并行)技术详解与实战

    编者按 如今传统的单机单卡模式已经无法满足超大模型进行训练的要求 如何更好地 更轻松地利用多个 GPU 资源进行模型训练成为了人工智能领域的热门话题 我们今天为大家带来的这篇文章详细介绍了一种名为 DDP Distributed Data
  • 一文弄懂事件Event与Kafka的区别

    事件 Event 和 Apache Kafka 是两个概念层面上有所不同的东西 它们在应用程序中的作用和使用场景也有很大的差异 1 概念和定义 事件 Event 事件是 系统内发生 的特定事情或状态变化的表示 在编程和软件设计中 事件通常被
  • 至多一次和恰好一次

    我正在研究分布式系统 当涉及到 RPC 部分时 我听说过这两种语义 最多一次和恰好一次 据我所知 当我们不希望重复执行时 最多一次用于数据库实例 第一个问题 这是如何实现的 服务器如何知道它不应该再次执行该请求 它可能是重复的 但也可能是合
  • 【分布式算法】Gossip协议详解

    一 为什么需要 Gossip 协议 为了实现 BASE 理论中的 最终一致性原则 两阶段提交协议和 Raft 算法需要满足 大多数服务节点正常运行 原则 如果希望系统在少数服务节点正常运行的情况下 仍能对外提供稳定服务 这时就需要实现最终一
  • 各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录(SSO)系统

    各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录 SSO 系统 单点登录 SSO 是一个登录服务层 通过一次登录访问多个应用 使用SSO服务可以提高多系统使用的用户体验和安全性 用户不必记忆多个密码 不必多次登录浪费时间 下面推荐一
  • Zookeeper 和 Dubbo 的关系?

    Zookeeper的作用 zookeeper用来注册服务和进行负载均衡 哪一个服务由哪一个机器来提供必需让调用者知道 简单来说就是ip地址和服务名称的对应关系 当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现 但是如果提供服务
  • 如何在gRPC拦截器中访问消息请求?

    我想在服务器端使用相同的拦截器来实现多种方法 因为它们都具有相同的请求类型 StateRequest rpc apply StateRequest returns StateResponse rpc cancel StateRequest
  • 华纳云:ServiceComb如何实现zipkin分布式调用链追踪

    Apache ServiceComb是一个开源的微服务框架 它提供了分布式系统开发所需的一系列工具和服务 在ServiceComb中 实现分布式调用链追踪可以通过整合Zipkin来实现 Zipkin是一个开源的分布式追踪系统 它可以帮助你跟
  • 为什么恰好一次语义不可行?

    在 Erlang 希望最好的 RPC 语义中 SUN RPC 具有至少一次 Java RMI 具有最多一次 但没有人拥有恰好一次语义 为什么拥有一次语义似乎不可行 例如 如果客户端不断重新发送唯一标记的请求 直到收到答复 并且服务器会跟踪所
  • 如何将数据从 gRPC 拦截器传递到服务方法调用?

    我需要传递一些数据ServerAuthIntereptor打电话 服务器验证拦截器 used in context parameters map private static final String AUTH CONTEXT authCo
  • 考虑极端天气线路脆弱性的配电网分布式电源配置优化模型【IEEE33节点】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 【复现】遗传算法求解分布式电源选址定容问题并考虑环境因素研究【IEEE33节点】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • RabbitMQ环境配置

    文章目录 安装Erlang 安装RabbitMQ 安装Erlang 下载地址 http erlang org download otp win64 25 3 2 7 exe 安装RabbitMQ 下载地址 https www rabbitm
  • 用于远程IP(主机)的Java RMI

    我是新手 我无法理解RMI正确 互联网上有大量的教程 但据我所知 它们都是针对本地主机的 服务器和客户端都运行在同一台机器上 我想在任何机器上运行客户端 并且主机将位于一台计算机上 让我们考虑一下IP 11 11 11 11 上1099 但
  • 我应该使用什么 RPC 模块在 Python 中实现 RCP,并且以后能够更改连接方法?

    我确实必须实现一些从 Python 到 Python 的 RPC 但出于安全原因 连接方法非常有限 目前看来我可以使用以下方式进行连接SSH并在远程系统上运行单个 python 脚本 将来 当我们可能必须使用其他东西进行连接时 这可能会发生
  • 没有代理/存根 DLL 的进程外 COM 服务器?

    我正在学习如何实现进程外 COM 服务器 并发现了这篇代码项目文章 构建本地 COM 服务器和客户端 分步示例 http www codeproject com Articles 8679 Building a LOCAL COM Serv
  • 有没有好的、简单的用于进程间调用的 RPC 库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在Python中使用gRPC处理自定义异常?

    我需要实现自定义异常来使用 Python 处理 gRPC 请求错误 对于 HTTP 请求 它很简单 当出现错误代码等时 请求库可以很好地捕获它 我正在寻找 gRPC 的类似方法来执行以下操作 try send gRPC request ex

随机推荐

  • C# 单例模式详解

    定义 单例模式是比较常见的一种设计模式 目的是保证一个类只能有一个实例 而且自行实例化并向整个系统提供这个实例 避免频繁创建对象 节约内存 单例模式的应用场景很多 比如我们电脑的操作系统的回收站就是一个很好的单例模式应用 电脑上的文件 视频
  • 2023年大唐杯仿真部分-5G信令流程仿真实验

    参考视频连接 第十届大唐杯信令流程仿真讲解 哔哩哔哩 bilibili 1 5G系统消息的获取 根据题目要求 UE开机需要获取消息 消息分别是MIB SIB1 SIB2 SIB3 上面为什么选的是SIB1 Systeminformation
  • 如何判断一个指定的经纬度点是否落在一个多边形内

    1 理论支持 如果从需要判断的点出发的一条射线与该多边形的焦点个数为奇数 则该点在此多边形内 否则该点在此多边形外 射线不能与多边形顶点相交 2 编程思路 该程序的思路是从A点出发向左做一条水平射线 平行于x轴 向X轴的反方向 判断与各边是
  • Golang实现一个事务型内存数据库

    内存数据库经我们经常用到 例如Redis 那么如何从零实现一个内存数据库呢 本文旨在介绍如何使用Golang编写一个KV内存数据库MossDB 特性 MossDB是一个纯Golang编写 可嵌入的 键值型内存数据库 包含以下特性 可持久化
  • 【spring】spring 的事务(transaction) 三 try catch对事务的影响

    文章目录 概述 1 非异常用例 1 1 创建工程 1 2 执行 2 内层抛出非check异常 外层进行捕获 3 内层抛出非check异常 外层不进行捕获 相关文章 spring 的事务 transaction 一 基础概念介绍 spring
  • 群晖NAS如何在内网部署HTTPS服务让浏览器信任证书

    前言 最近在折腾内部部署Web服务 通过Vue实现一个H5的内部的管理服务 但在实际部署过程中由于种种原因 必须部署成Https服务 但在部署成Https服务后 由于没有HTTPS证书 每次进入页面都会被浏览器拦截 使用起来非常不便 于是开
  • Pandas 过滤dataframe中包含特定字符串的数据

    假如有一列全是字符串的dataframe 希望提取包含特定字符的所有数据 该如何提取呢 因为之前尝试使用filter 发现行不通 最终找到这个行得通的方法 举例说明 我希望提取所有包含 Mr 的人名 1 首先将他们进行字符串化 并得到其对应
  • 国内iso镜像站点

    http mirrors aliyun com centos
  • vue小项目实战

    项目概念图 devWebpackConfig plugins push new FriendlyErrorsPlugin compilationSuccessInfo messages Your application is running
  • shopify网站如何提高视觉冲击力

    1 首屏使用视频 2 页面引入酷炫动画 3 使用对比强烈的色彩
  • CSS-定位-背景图

    定位 背景图 一 定位 position 1 相对定位 relative 2 绝对定位 absolute 3 固定定位 fixed 4 定位练习 二 背景图 background 1 属性 2 实例一 3 背景图定位 4 雪碧图的使用 三
  • 12款很赞的web前端移动开发框架

    原生移动应用程序运行更快 更顺畅 有更好的用户体验 而同时 前端开发人员总是寻找新的 Web 技术来获得这种性能 利用现有的高质量移动框架来构建移动 Web 应用程序已成为非常容易 但是如何选择合适的框架是比较纠结的 因此在本文中 我们整理
  • 刷简单的题也很吃力怎么办?

    文章目录 一 分享自己相关的经历 1 1 刷简单题目感到吃力的原因 1 2 解决该问题的重要性和目的 二 分析可能存在的问题 三 根据问题进行分解或建立思维导图 四 分享好用的刷题网站并进行介绍 明明自觉学会了不少知识 可真正开始做题时 却
  • POI操作ppt,合并,转图片

    引入POI compile group org apache poi name poi ooxml version 4 1 0 compile group batik name batik bridge version 1 6 1 comp
  • python中if错误-python中的异常处理

    异常 异常就是程序运行时发生错误的信号 在python中 错误触发的异常如下 异常种类 在python中不同的异常可以用不同的类型 python中统一了类与类型 类型即类 去标识 不同的类对象标识不同的异常 一个异常标识一种错误 常见异常
  • Simon ILETS —— Listening

    content I want to say ahead Listening Know the test basic information Four sections Section 1 Key technique Section 2 Se
  • 小程序:调用手机的相册

    1 需求 点击按钮 调用手机相册选择图片上传 2 解决方案 Button 上加 openType chooseAvatar onChooseAvatar 写方法 必须用button 按钮 更改下样式看不出来就行 3 代码 解决方案 1 Bu
  • Linux——文件系统:目录组织结构、文件类型、文件权限等

    在Linux中 所有的设备都是文件 文件的类型是根据文件头字段来判断 而非文件的后缀名 Linux的文件系统 EXT4 索引式的文件系统 以EXT4文件系统格式化磁盘时 将磁盘分成三个区 1 superblock 记录文件系统的整体信息 包
  • 微信小程序 短信验证 功能的实现(附案例代码/前后端/直接用)

    模块效果展示 小程序界面 实现的功能 小程序端 请求获取短信验证码 两次请求之间间隔至少一分钟 填写必填内容后 才能提交表单 手机号合法性检验 后台 接前台请求后 通过阿里云发送短信 生成随机数字验证码 默认6位 收到提交的表单后 对验证码
  • 如何实现IM即时通信系统(一)

    在企业数字化建设过程中 如何与客户保持线上链接是重要的组成部分 而IM通信系统就属于数字化建设的基础设施 那么 如何实现一个符合企业需求的IM系统呢 采购当然是其中需要考虑的方式之一 但就我个人的经验来看 市面上好的IM厂商很稀少 因为IM