在CSDN学Golang场景化解决方案(即时通讯goim)
一,支持单个、多个、广播消息推送
在goim中,用户可以通过维护长连接实现即时通讯功能,通过路由算法将消息发送给指定的客户端或群组。具体而言,goim支持以下三种方式进行消息推送:
- 单个推送:向某一个指定客户端发送消息。
- 多个推送:向一组指定客户端发送消息。
- 广播推送:向所有在线客户端发送消息。
以上三种方式均可以实现即时通讯功能。同时,在分布式部署下,goim也可以保证数据的高可用性和负载均衡
二,心跳检测(应用心跳和tcp、keepalive、http log pulling)
goim是一款开源的Golang实现的即时通讯系统,它提供了多种心跳检测机制。
- 应用心跳:客户端和服务器之间通过TCP连接保持长连接,客户端可以定期发送心跳包告知服务器自己在线。这种方式比较简单易行,但需要客户端占用一定的带宽和CPU资源。
- TCP Keepalive:在TCP层面上设置Keepalive参数,可以检测连接是否异常断开。这种方式可以避免应用心跳导致的性能问题,并且不会影响到其他应用程序。
- HTTP Log Pulling:客户端定期向服务器请求最新的日志信息,并根据返回结果判断服务器是否在线。这种方式可以有效减少网络流量,但需要服务器支持HTTP服务并且客户端需要处理HTTP请求和响应逻辑。
综合来说,goim采用了多种心跳检测机制,并且针对不同场景选择不同的方案以达到最优化效果。其中TCP Keepalive是最常见和可靠的方案,在保证性能和稳定性同时也减少了网络流量消耗。
三,接入层支持多协议(websocket,tcp,http)
goim接入层支持多协议,包括WebSocket、TCP和HTTP。
WebSocket:在GoIM中使用WebSocket时,客户端和服务器之间可以建立长连接,并且双方都可以主动发送消息。此外,WebSocket还支持跨域访问,在Web开发中比较常用。
TCP:在GoIM中使用TCP时,客户端和服务器之间同样也是通过建立长连接来实现即时通讯。相比于WebSocket,TCP更加底层,并且不支持跨域访问。
HTTP:在GoIM中使用HTTP时,则需要借助第三方库来实现。常见的做法是将HTTP请求转化为长连接或者短连接,然后通过长连接或短连接进行即时通讯。
综合来说,GoIM的接入层支持多协议,并且能够根据具体需求选择合适的协议进行即时通讯。
四,可拓扑的架构(job、logic模块可动态无限扩展)
GoIM是一个可拓扑的架构,其中job和logic模块都可以动态无限扩展。
Job模块:在GoIM中,Job模块主要负责消息队列的处理。如果需要增加Job节点,只需要启动新的Job节点即可,然后通过配置文件将新的节点加入到集群中。此外,在使用Redis作为消息队列时,还需要对Redis进行分片处理来支持水平扩展。
Logic模块:在GoIM中,Logic模块主要负责业务逻辑的处理。如果需要增加Logic节点,则可以通过启动新的Logic节点并将其加入到集群中来实现动态扩展。此外,在添加新的节点之前,需要确保已经将用户数据同步到所有现有节点,并且将新的节点添加到路由表中。
总体来说,GoIM具有良好的可拓扑性,并且能够根据业务需求灵活地进行横向扩展。
五,基于Kafka做异步消息推送
GoIM是一个开源的即时通讯系统,它主要使用了Golang和Kafka。其中,Kafka用于异步消息推送。
在GoIM中,当用户发送消息时,该消息会首先被发送到Job节点,并被写入Kafka的Topic中。然后,由Logic节点从Kafka中读取该消息,并将其转发给目标用户。这种方式可以有效地解耦生产者和消费者之间的关系,并提高系统的可扩展性和可靠性。
此外,在使用Kafka作为消息队列时,还需要注意以下几点:
- 为了保证高吞吐量和低延迟,需要对Kafka进行优化,并配置合适的参数。
- 需要保证数据的一致性。在GoIM中,可以通过多副本机制来保证数据的一致性。
- 需要考虑集群扩容和缩容问题。在添加或删除节点时,需要注意同步数据和重新分配分区等问题。
总体来说,基于Kafka做异步消息推送是一种常见且有效的方案,在实现高并发、大规模即时通讯系统时值得借鉴。
六,注册发现服务
GoIM使用的注册发现服务是Zookeeper。Zookeeper是一个分布式的协调服务,主要用于解决分布式应用中的一些共享资源问题,如配置信息、命名服务、集群管理等。
在GoIM中,所有的节点都会向Zookeeper注册自己,并监听其他节点的变化。当有新节点加入时,已经注册的节点会接收到通知,并更新自己维护的节点列表。当有节点退出时,也会触发相应的事件,并及时将该节点从列表中移除。
通过这种方式,可以有效地保证整个系统中各个组件之间的协作和通信,并且支持高可靠性和可扩展性。
需要注意的是,在使用Zookeeper时需要注意以下几点:
- 需要保证Zookeeper集群的稳定性和可靠性。一旦Zookeeper出现故障或不可用,整个系统将无法正常运行。
- 需要合理配置参数以提高系统性能和吞吐量。
- 需要定期备份数据以避免数据丢失风险。
总体来说,使用Zookeeper作为注册发现服务可以帮助我们快速实现分布式应用程序,并提供高效、可靠、强大的协调功能。
七,消息协议设计(基于protobuf)
GoIM使用Protobuf作为消息协议,具体设计如下:
- 消息头部:包含消息类型、消息长度等信息,以确保能够正确解析和处理每条消息。
- 消息体:根据不同的消息类型进行定义。比如聊天消息、推送消息、心跳包等。
- 消息尾部:用于标识该消息是否完整,以及对数据完整性进行校验。
在实际使用中,可以将所有的请求和响应都封装成一个结构体,并通过Protobuf序列化成二进制流。这样做的好处是可以方便地扩展新的协议和功能,并且减少了网络传输中的数据量和延迟。
同时,在设计协议时需要注意以下几点:
- 协议格式要简单明了,并且易于扩展。
- 采用二进制流传输方式,可以减少网络传输中的数据量和延迟。
- 要支持压缩算法以提高网络传输效率。
- 需要考虑安全性问题,比如加密、签名等机制。
总之,合理设计消息协议是保证分布式系统正常运行的关键因素之一。在GoIM中采用了基于Protobuf的设计方案,既能够满足高效传输、易于扩展的需求,又能够保证数据的完整性和安全性。
八,goim推送服务架构分析
GoIM的推送服务主要是通过使用Redis和Zookeeper构建一个高可用的消息路由,以实现消息推送功能。具体架构如下:
- 消息存储:在接收到客户端发送的消息后,首先需要将消息保存到Redis缓存中。这样可以确保即使在出现故障时也能够保证数据不会丢失。
- 消息路由:GoIM采用了Zookeeper作为服务注册中心,当有新的客户端连接时,会向Zookeeper注册该客户端信息,并同时创建对应的节点。每个节点包含了客户端所订阅的所有频道信息。
- 消息推送:当某个频道发布了一条新消息后,就需要将这条消息通过路由表推送给所有订阅该频道的客户端。具体实现方式是根据Zookeeper维护的路由表,将消息分发给所有订阅该频道的客户端。
- 高可用性:GoIM采用了多台服务器共同承担推送服务,各个服务器之间进行负载均衡,并通过Redis、Zookeeper等技术实现高可用性。当某一台服务器出现故障时,其他服务器会自动接管它所负责的任务。
GoIM采用了基于Redis和Zookeeper构建高可用性、高效率、低延迟、易扩展的消息路由服务,使得消息推送能够快速、可靠地传递给所有订阅者。
九,grpc客户端服务端编程
GoIM的gRPC客户端和服务端都是基于gRPC协议实现的,这里提供一些基本思路。
- 定义Protobuf文件:首先需要定义用于通信的Protobuf文件。在这个文件中,你需要定义消息结构、接口方法以及它们的输入输出类型。例如:
syntax = "proto3";message Message {string id = 1;string content = 2;
}service ChatService {rpc SendMessage(Message) returns (google.protobuf.Empty);
}
- 编写服务端代码:服务端代码需要实现上述定义的接口,并且监听指定的IP和端口号。当有客户端连接时,可以创建一个新线程来处理请求。例如:
type chatServer struct{}func (s *chatServer) SendMessage(ctx context.Context, msg *pb.Message) (*empty.Empty, error) {fmt.Printf("Received message: %v\n", msg)return &empty.Empty{}, nil
}func main() {lis, err := net.Listen("tcp", ":8080")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterChatServiceServer(s, &chatServer{})if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}
- 编写客户端代码:客户端代码需要创建一个与服务端连接的gRPC通道,并使用该通道创建一个对应的客户端对象。然后就可以调用服务端暴露出来的接口方法了。例如:
func main() {conn, err := grpc.Dial(":8080", grpc.WithInsecure())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()c := pb.NewChatServiceClient(conn)msg := &pb.Message{Id: "1",Content: "Hello world!",}_, err = c.SendMessage(context.Background(), msg)if err != nil {log.Fatalf("could not send message: %v", err)}
}
以上是GoIM的gRPC客户端和服务端编程的基本思路,具体实现还需要根据实际需求进行调整。
相关文章:
在CSDN学Golang场景化解决方案(即时通讯goim)
一,支持单个、多个、广播消息推送 在goim中,用户可以通过维护长连接实现即时通讯功能,通过路由算法将消息发送给指定的客户端或群组。具体而言,goim支持以下三种方式进行消息推送: 单个推送:向某一个指定客…...
chrome插件开发实例02-使用content_scripts对用户浏览页面操作
目录 引言 chrome插件 插件演示 源代码 manifest.json content_scripts.js css设置(放在css文件夹下)<...
【Python目标识别】Labelimg标记深度学习(YOLO)样本
人工智能、ai、深度学习已经火了很长一段时间了,但是还有很多小伙伴没有接触到这个行业,但大家应该多多少少听过,网上有些兼职就是拿电脑拉拉框、数据标注啥的,其实这就是在标记样本,供计算机去学习。所以今天跟大家分…...
【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
C高级--day3(shell中的输入、命令置换符、数组、算数运算、分支结构)
#!/bin/bash pls ~/ -l | grep "^-" | wc -l qls ~/ -l | grep "^d" | wc -l echo "普通文件个数:$p" echo "目录文件个数:$q"#!/bin/bash read file posexpr index $file \. strexpr substr $file $((pos1)) 2…...
安防监控国标GB28181平台EasyGBS视频快照无法显示是什么原因?如何解决?
安防视频监控国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发ÿ…...
route命令 路由表 Linux Centos
route route命令在Linux中被用于显示和操纵IP路由表。然而,现在大部分Linux发行版都推荐使用ip route命令代替route,因为ip route提供更多的功能和更灵活的控制。 以下是route命令的基本用法: 查看路由表: route -n 这个命令显示当前机器的路…...
CMMI评审
CMMI评审 对于刚入行的朋友来说,可能对CMMI比较陌生。但对于工作多年的朋友来说,有可能都会接触过CMMI。那CMMI到底是什么? CMMI的全称为Capability Maturity Model Integration,即能力成熟度模型集成。对于软件行业,一般是指软件能力成熟度模型集成,是由美国国防部与卡内…...
深入了解 PostgreSQL 扩展插件
深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中,扩展插件是极具价值的工具,它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件,包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…...
记一次kernel patch(附开源贡献相关)
文章目录 开源操作系统流程手记smatch能发现的典型问题常见的修复方案附:偶然发现,unlikely函数搞开源贡献的一些捷径 开源操作系统 看了zhihu上的一些科普,明白二次开发是常见现象,套壳、抄袭、自研都不是很科学的说法。中外大厂…...
Pytorch Tutorial【Chapter 1. Basic operation of tensor】
Pytorch Tutorial 文章目录 Pytorch TutorialChapter 1. Basic operation of tensorReference Chapter 1. Basic operation of tensor 本节介绍有关张量Tensor的基本操作 Tensor相当于numpy中的ndarrays 创建空Tensor和全零Tensor,torch.zeros(d0,d1)类似于numpy…...
[环境配置]centos7安装vncserver
1. 首先,需要安装X Window System和GNOME桌面环境。可以通过以下命令进行安装: yum groupinstall "X Window System" yum groupinstall "GNOME Desktop" 2. 安装VNC服务器。可以通过以下命令进行安装: yum install ti…...
Excel功能总结
1)每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如:固定第1~2行,设置成“$1:$2” 2)将页面内容打印在一页【缩印】 1.选好需要打印的区域,“页面布…...
用Rust实现23种设计模式之 组合模式
组合模式是一种结构型设计模式,它允许将对象组合成树状结构,并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景: 优点: 简化客户端代码:组合模式通过统一的方式处理单个对象和组合对象&a…...
opencv36-形态学操作-膨胀 cv2.dilate()
膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的…...
8266 ESP-07模块的使用 以及详细介绍
esp8266系列 陶瓷天线 版本 详细介绍说明 最近使用8266的ESP-01S做了个数据无线收发装置,发现板载天线信号太弱,装上外壳后信号更弱,因此考虑能否使用带有外接天线的模块代替ESP-01S。经过在安可信官网搜索发现,ESP07、ESP07S、ES…...
Linux之 centos、Ubuntu 安装常见程序 (-) Mysql 5.7 版本和8.0版本
CentOS 安装 MySql 注意 需要有root权限 安装5.7版本 – 由于MySql并不在CentOS的官方仓库中,所以需要通过rmp命令: 导入MySQL仓库密钥 1、配置MySQL的yum仓库 配置yum仓库 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装…...
【IDEA+Spark Streaming 3.4.1+Dstream监控套接字流统计WordCount保存至MySQL8】
【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】 把DStream写入到MySQL数据库中 Spark 3.4.1MySQL 8.0.30sbt 1.9.2 文章目录 【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】前言一、背景说明二、使用步骤1.引入库2…...
Dcat Admin 入门应用指南
在现代的网络应用开发中,管理后台是不可或缺的一部分。它为开发者提供了一个方便管理和监控应用数据的界面。而 Dcat Admin 是一个强大的管理后台框架,它基于 Laravel 框架开发,提供了丰富的功能和灵活的扩展性。本文将带您深入了解 Dcat Adm…...
计算机视觉:替换万物Inpaint Anything
目录 1 Inpaint Anything介绍 1.1 为什么我们需要Inpaint Anything 1.2 Inpaint Anything工作原理 1.3 Inpaint Anything的功能是什么 1.4 Segment Anything模型(SAM) 1.5 Inpaint Anything 1.5.1 移除任何物体 1.5.2 填充任意内容 1.5.3 替换任…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
