开源IM项目OpenIM发布消息推送api,支持应用与IM互通深度融合

开源IM项目OpenIM发布消息推送api,支持应用与IM互通深度融合,第1张

以办公场景为例,比如员工入职通知,放假通知等业务通知,由oa系统处理具体的业务逻辑,再调用消息推送api,触达到目标用户。

效果示例

以协同办公为例,员工收到系统推送的工作通知,有新任务需要处理。  

员工点击工作通知,可以查看具体详情,每条通知有不同的发送者昵称和头像。这种通知类型是一种新的会话类型,全部聚合在同一个会话。

OpenIM简介

OpenIM:从服务端到客户端SDK开源即时通讯整体解决方案。开发者可以轻松替代第三方IM云服务,打造具备聊天、社交功能的app,也可以在自身应用中集成SDK,以提供即时通讯能力。开源IM的价值在于“一切皆可控”“我的信息我做主”,无论是技术,还是信息安全。

整体超过7.2K star,OpenIM作为开源IM的领跑者,持续添加新功能,包括消息推送api,群聊已读。服务端和sdk都是Apache-2.0 License授权协议,可以免费使用。带有UI的产品需要商业授权,有兴趣的客户可以联系我们深度交流。

5X8小时vip专属服务,包括:

(1)一对一技术咨询,微信 电话等各种方式;

(2)sdk使用辅导咨询;

(3)服务端架构及部署答疑;

(4)IM新需求优先排期;

(5)bug优先修复;

(6)系统维护和故障响应;

web端体验:https://open-im-online.rentsoft.cn/

安卓端体验:https://www.pgyer.com/OpenIM

iOS端体验:

https://testflight.apple.com/join/o956rTGx

单机性能及容量总结

服务器资源:8核16G内存, 6个机械磁盘,每个磁盘100G, mongo 分片,10MB带宽。

容量:用户同时在线10万以上,消息条数10亿。

性能评估:同时在线用户10万,每秒钟发送消息900条,(从发送者发出消息到接收到消息)消息延时1秒

可靠性总结

每条消息都能被对方精确收到,并成功落地app本地db。对于失败的3条消息,接收方确实没有收到,确保系统消息一致性。

系统具备优秀的平行扩展能力,除存储模块外,其他模块都无状态,支持亿级用户,千亿消息量。

github地址:https://github.com/OpenIMSDK/Open-IM-Server

开发者中心:https://doc.rentsoft.cn/#/

简要描述

管理员通过后台接口发送通知类型消息

请求URL

http://x.x.x.x:10000/manager/send_msg

请求方式

POST

请求示例

  {

"operationID": "Oa notification operationID111", 

"sendID": "openIM123456", 

"recvID": "18712345678", 

"senderPlatformID": 2, 

"senderFaceURL": "http://www.head.com", 

"senderNickname": "系统通知2", 

"content": {

"notificationName": "公文管理", 

"notificationFaceURL": "http://www.head1.com", 

"notificationType": 1, 

"text": "大家好,今天是...", 

"externalUrl":"",

"mixType": 0, 

"pictureElem": {

"sourcePath": "", 

"sourcePicture": {

"uuid": "", 

"type": "", 

"size": 0, 

"width": 0, 

"height": 0, 

"url": ""

}, 

"bigPicture": {

"uuid": "", 

"type": "", 

"size": 0, 

"width": 0, 

"height": 0, 

"url": ""

}, 

"snapshotPicture": {

"uuid": "", 

"type": "", 

"size": 0, 

"width": 0, 

"height": 0, 

"url": ""

          }

}, 

"soundElem": {

"uuid": "", 

"soundPath": "", 

"sourceUrl": "", 

"dataSize": 0, 

"duration": 0

}, 

"videoElem": {

"videoPath": "", 

"videoUUID": "", 

"videoUrl": "", 

"videoType": "", 

"videoSize": 0, 

"duration": 0, 

"snapshotPath": "", 

"snapshotUUID": "", 

"snapshotSize": 0, 

"snapshotUrl": "", 

"snapshotWidth": 0, 

"snapshotHeight": 0

}, 

"fileElem": {

"filePath": "", 

"uuid": "", 

"sourceUrl": "", 

"fileName": "", 

"fileSize": 0

}, 

"ex": ""

}, 

"contentType": 1400, 

"sessionType": 4, 

"isOnlineOnly": false, 

"offlinePushInfo": {

"title": "admin revoke your message", 

"desc": "", 

"ex": "", 

"iOSPushSound": "default", 

"iOSBadgeCount": false

  }

}Copy to clipboardErrorCopied

请求参数

参数名类型必选说明

operationIDstring是操作ID,保持唯一,建议用当前时间微秒+随机数,用于后台链路追踪问题使用

sendIDstring是管理员ID,为后台config文件中配置的管理员ID中一个,默认openIM123456

recvIDstring是接收者userID

senderPlatformIDint否发送者平台号,模拟用户发送时填写, 1->IOS,2->Android,3->Windows,4->OSX,5->Web,5->MiniWeb,7->Linux

senderFaceURLstring否发送者头像,用于客户端通知会话产生

senderNicknamestring否发送者昵称,用于客户端通知会话产生

contentobject是消息的具体内容,内部是json 对象

notificationNamestring是通知标题

notificationFaceURLstring是通知头像

notificationTypeint是通知类型,如:1代表入职通知,2代表离职通知

textstring是通知正文e

externalUrlstring否通知点击后需要跳转到的地址链接(不填则无需跳转)

mixTypeint是通知混合类型 0:纯文字通知 1:文字+图片通知 2:文字+视频通知 3:文字+文件通知

pictureElemobject否图片元素对象

sourcePictureobject否原图

bigPictureobject否大图

snapshotPictureobject否缩略图

soundElemobject否声音元素对象

videoElemobject否视频元素对象

fileElemobject否文件元素对象

uuidstring否对象唯一ID用于缓存使用

type/videoType/string否图片类型/视频类型

size/dataSize/videoSize/snapshotSize/fileSizeint否多媒体文件大小,单位字节

width/snapshotWidthint否图片/视频缩略图宽度

height/snapshotHeightint否图片/视频缩略图高度

url/sourceUrl/videoUrlstring否图片/文件/视频的URL

sourcePath/soundPath/videoPath/filePathstring否文件路径,可不填写

fileNamestring否文件名字

exstring否扩展字段

contentTypeint是消息类型固定为1400

sessionTypeint是通知会话类型固定为4

isOnlineOnlybool否改字段设置为true时候,发送的消息服务器不会存储,接收者在线才会收到,不在线该消息丢失。

offlinePushInfoobject否离线推送的具体内容,如果不填写,使用服务器默认推送标题

titlestring否推送的标题

descstring否推送的具体描述

exstring否扩展字段

iOSPushSoundstring否IOS的推送声音

iOSBadgeCountbool否IOS推送消息是否计入桌面图标未读数

返回示例

{

"errCode": 0, 

"errMsg": "", 

"data": {

"serverMsgID": "", 

"clientMsgID": "", 

"sendTime": 1645697804432

}

}Copy to clipboardErrorCopied

返回参数

参数名类型说明

errCodeint0成功,非0失败

errMsgstring错误信息

sendTimeint消息发送的具体时间,具体为毫秒的时间戳

serverMsgIDstring服务器生成的消息的唯一ID

clientMsgIDstring客户端生成的消息唯一ID,默认情况使用这个为主键

消息类型格式描述

简要描述

管理员消息发送字段中contentType支持的消息类型说明以及消息content的具体字段说明。

ContentType消息类型说明

ContentType值类型说明

101文本消息

102图片消息

103音频消息

104视频消息

105文件消息

106群聊中的@类型消息

107合并转发类型消息

108名片消息

109地理位置类型消息

110自定义消息

111撤回类型消息

112已读回执类型消息

114引用类型消息

Content具体内容

content内部为具体的json对象,不同的消息类型是不同的json对象

文本消息

{

...,

"content": {

"text": "nihao"

},

....

}Copy to clipboardErrorCopied

参数名必选类型说明

text是string文本消息的具体内容

自定义消息

{

...,

"content": {

"data": "", 

"description": "", 

"extension": ""

},

....

}Copy to clipboardErrorCopied

参数名类型必选说明

datajson string是用户自定义的消息为json对象转换后的string

descriptionjson string否扩展的描述信息为json对象转换后的string,可以不使用

extensionjson string否扩展字段,暂时不使用

随着信息技术的快速发展及互联网用户规模的急剧增长,计算机所存储的信息量正呈爆炸式增长,目前数据量已进入大规模和超大规模的海量数据时代, 如何高效地存储、分析、处理和挖掘海量数据 已成为技术研究领域的热点和难点问题。而 如何采集和运营管理、分析这些数据 也是大数据处理中一个至关重要的组成环节,这就需要相应的基础设施对其提供支持。针对这个需求,当前业界已有很多开源的消息系统应运而生,kafka就是一款当然非常流行的消息系统。

Kafka是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、基于ZooKeeper协调管理的分布式流平台的功能强大的消息系统。作为一个流式处理平台,必须具备以下3个关键特性:

1) 能够允许发布和订阅流数据。

2) 存储流数据时提供相应的容错机制。

3) 当流数据到达时能够被及时处理。

消息流系统kafka的基本结构包括生产者和消费者,以及kafka集群。

生产者负责生产消息,将消息写入Kafka集群;消费者从Kafka集群中拉取消息。

消息是Kafka通信的基本单位 ,由一个 固定长度的消息头 和一个 可变长度的消息体 构成。

Kafka将 一组消息 抽象归纳为一个主题(Topic),也就是说,一个主题是对消息的一个分类。 生产者将消息指定主题发送到kafka集群,消费者订阅主题或主题的某些分区进行消费。

Kafka将一组消息归纳为一个主题,而 每个主题又被分成一个或多个分区(Partition) 。每个分区由一系列有序、不可变的消息组成,是一个有序队列。 每个分区在物理上对应为一个文件夹 ,分区的命名规则为主题名称后接“—”连接符,之后再接分区编号,分区编号从0开始,编号最大值为分区的总数减1。

分区使得Kafka在并发处理上变得更加容易,理论上来说,分区数越多吞吐量越高,但这要根据集群实际环境及业务场景而定。同时,分区也是Kafka保证消息被顺序消费以及对消息进行负载均衡的基础。

疑问和答案 :分区如何保证消息被顺序消费?每个分区内的消息是有序的,但不同分区间如何保证?猜测是分区从存储空间上比较大,分区个数少。顺序消费的主要因素在分区内的消息,分区间的可以忽略。高吞吐率顺序写磁盘估计也是这个原因。

Kafka只能保证一个分区之内消息的有序性,并不能保证跨分区消息的有序性。 每条消息被追加到相应的分区中,是顺序写磁盘,因此效率非常高,这是Kafka高吞吐率的一个重要保证 。同时与传统消息系统不同的是,Kafka并不会立即删除已被消费的消息,由于磁盘的限制消息也不会一直被存储,因此 Kafka提供两种删除老数据的策略 ,一是基于消息已存储的时间长度,二是基于分区的大小。这两种策略都能通过配置文件进行配置。

每个分区又有一至多个副本(Replica),分区的副本分布在集群的不同代理上,以提高可用性。

从存储角度上分析,分区的每个副本在逻辑上抽象为一个日志(Log)对象,即分区的副本与日志对象是一一对应的。每个主题对应的 分区数 可以在Kafka启动时所加载的配置文件中配置,也可以在创建主题时指定。当然,客户端还可以在主题创建后修改主题的分区数。

为什么副本要分Leader和Follower? 如果没有Leader副本,就需要所有的副本都同时负责读/写请求处理,同时还得保证这些副本之间数据的一致性,假设有n个副本则需要有n×n条通路来同步数据,这样数据的一致性和有序性就很难保证。

为解决这个问题,Kafka选择分区的一个副本为Leader,该分区其他副本为Follower,只有 Leader副本 才负责处理客户端 读/写请求 ,Follower副本从Leader副本同步数据。

引入Leader副本后客户端只需与Leader副本进行交互,这样数据一致性及顺序性就有了保证。Follower副本从Leader副本同步消息,对于n个副本只需n-1条通路即可,这样就使得系统更加简单而高效。

副本Follower与Leader的角色并不是固定不变的,如果Leader失效,通过相应的选举算法将从其他Follower副本中选出新的Leader副本。

疑问 :leader副本和follower副本是如何选出来的?通过zookeeper选举的嘛?

Kafka在ZooKeeper中动态维护了一个 ISR(In-sync Replica) ,即保存同步的副本列表,该列表中保存的是与Leader副本保持消息同步的所有副本对应的代理节点id。 如果一个Follower副本宕机或是落后太多 ,则该Follower副本节点将 从ISR列表中移除 。 本书用宕机 来特指某个代理失效的情景,包括但不限于代理被关闭,如代理被人为关闭或是发生物理故障、心跳检测过期、网络延迟、进程崩溃等。

任何发布到分区的消息会被直接追加到日志文件的尾部(分区目录下以“.log”为文件名后缀的数据文件),而每条 消息 在日志文件中的位置都会对应一个按序递增的 偏移量 。偏移量是一个分区下严格有序的 逻辑值 ,它并不表示消息在磁盘上的物理位置。由于Kafka几乎不允许对消息进行随机读写,因此Kafka并没有提供额外索引机制到存储偏移量。

消费者可以通过控制消息偏移量来对消息进行消费 ,如消费者可以指定消费的起始偏移量。 为了保证消息被顺序消费,消费者已消费的消息对应的偏移量也需要保存 。需要说明的是,消费者对消息偏移量的操作并不会影响消息本身的偏移量。旧版消费者将消费偏移量保存到ZooKeeper当中, 而新版消费者是将消费偏移量保存到Kafka内部一个主题当中。 当然,消费者也可以自己在外部系统保存消费偏移量,而无需保存到Kafka中。

推测 :一个主题有多个分区,一个分区有多个副本。一个主题(一类消息)有多个分区(消息被分段),一个分区(每段消息)有多个副本(每段消息的副本数)。消息一旦发给kafka,就会分配一个偏移量,在多个副本中的偏移量是一样的。这样的话,消费者通过偏移量消费时对于多个副本就没有差异性。

Kafka集群由一个或多个Kafka实例构成,每一个Kafka实例称为代理(Broker),通常也称代理为Kafka服务器(KafkaServer)。在生产环境中Kafka集群一般包括一台或多台服务器,我们可以在一台服务器上配置一个或多个代理。 每一个代理都有唯一的标识id,这个id是一个非负整数 。在一个Kafka集群中,每增加一个代理就需要为这个代理配置一个与该集群中其他代理不同的id, id值可以选择任意非负整数即可,只要保证它在整个Kafka集群中唯一,这个id就是代理的名字,也就是在启动代理时配置的broker.id对应的值。

生产者(Producer)负责将消息发送给代理,也就是向Kafka代理发送消息的客户端。

消费者(Comsumer)以拉取(pull)方式拉取数据,它是消费的客户端。在Kafka中 每一个消费者都属于一个特定消费组 (ConsumerGroup),可以为每个消费者指定一个消费组,以groupId代表消费组名称,通过group.id配置设置。 如果不指定消费组 ,则该消费者属于默认消费组test-consumer-group。

每个消费者有一个全局唯一的id ,通过配置项client.id指定, 如果客户端没有指定消费者的id, Kafka会自动为该消费者生成一个全局唯一的id,格式为${groupId}-${hostName}-${timestamp}-${UUID前8位字符}。 同一个主题的一条消息只能被同一个消费组下某一个消费者消费 ,但不同消费组的消费者可同时消费该消息。 消费组是Kafka用来实现对一个主题消息进行广播和单播的手段 ,实现消息广播只需指定各消费者均属于不同的消费组,消息单播则只需让各消费者属于同一个消费组。

推论: kafka消息是按照消息类型(主题),在一个消费者组中只能消费一次。也就是一个消费者组只消费一类型的消息。如果某个服务要消费一类消息,必须将自己置为不同的消费者组。

Kafka利用ZooKeeper保存相应元数据信息, Kafka元数据信息包括如代理节点信息、Kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。 Kafka在启动或运行过程当中会在ZooKeeper上创建相应节点 来保存元数据信息, Kafka通过监听机制在这些节点注册相应监听器来监听节点元数据的变化 ,从而由ZooKeeper负责管理维护Kafka集群,同时通过ZooKeeper我们能够很方便地对Kafka集群进行水平扩展及数据迁移。

这个多了去了 ,apache 绝对是 开源里面的领头羊

for example:

分类 项目名 说明 开发语言

服务器

(共20) Apache HTTP Server 全球第一HTTP服务器 C/C++

Tomcat Java的Web服务器 Java

James 邮件服务器 Java

SpamAssassin 反垃圾邮件 C/C++

Perl Apache的Perl编程语言支持 C/C++

Tcl TCL脚本语言 C/C++

Directory Server 超级目录服务器 Java

Axis WebServic服务器 Java

Kandula Axis中WS-Coordination、WS-AtomicTransaction、WS-BusinessActivity协议的实现 Java

Muse Axis中WS-ResourceFramework (WSRF), WS-BaseNotification (WSN), and WS-DistributedManagement (WSDM) 标准的实现(该项目Logo是个不认识的古汉字) Java

Pubscribe Web Services Notification (WSN) 标准实现 Java

Sandesha WS-ReliableMessaging 标准实现 Java

WSS4J WS-Security 标准实现 Java

WSRF Web Services Resource Framework 标准实现 Java

Addressing WebService的WS-Addressing标准(IBM、微软、BEA发布)实现 Java

XML Security XML签名与加密标准的Java、C++实现 Java/C++

jUDDI UDDI的Java实现 Java

XML-RPC XML-RPC实现 Java

Derby 纯Java做的关系数据库 Java

Xindice XML数据库 Java

开发工具(共5) Ant 自动编译 Java

Maven 项目管理工具,比Ant强大,支持插件开发 Java

Gump 每日集成工具,支持Ant、Maven Python

JMeter Web应用性能测试 Java

DdlUtils 用XML来定义DDL Java

Web开发框架(共19) Struts MVC的Web开发框架 Java

Cocoon Web开发框架,基于可运行的XML管道语言 Java

FOP XSL-FO 打印与输出解决方案,基于Java Java

AxKit 基于XML的Web发布 Java

Tapestry Web开发框架 Java

Turbine Web开发框架 Java

Shale 基于JSF的Web开发框架 Java

MyFaces 第一个开源的JSF实现 Java

Beehive 基于Structs的J2EE框架,简化J2EE编程;含Web界面、WebService开发框架 Java

Velocity 模板引擎 Java

Portals 门户解决方案 Java

Cactus Web开发测试框架 Java

Forrest 基于Cocoon的Web发布解决方案 Java

Slide 内容管理,支持WebDAV Java

Jackrabbit 内容库,用于内容管理 Java

Lenya 内容管理,支持版本管理、工作流、所见所得编辑器 Java

Xang 基于JavaScript进行动态Web开发 Java

Xindice 纯XML数据库 Java

JCS 分布式Cache系统(Java Caching System) Java

容器(共7) Geronimo J2EE容器,类似JBoss Java

iBATIS 简单OR映射,有.NET版本 Java/C#

Torque OR映射 Java

ORB ObjectRelationalBridge,OR映射 Java

JDO JDO标准的一个实现 Java

HiveMind 类似Spring的东西,微内核DI容器 Java

Excalibur IoC容器 Java

组件(共82) APR 不同操作系统间可移植运行时库 C/C++

Regexp Java正则表达式 Java

ORO Perl风格的正则表达式 Java

Xerces XML解析,Java/C两种版本 Java/C++

Crimson XML解析器 Java

AXIOM 更高效的DOM实现 Java

Lucene 全文检索,有.NET版本 Java/C#

Logging 不仅Log4j,各个语言的版本都有了 Java/C++/Perl/C#

XMLBeans XML转对象 Java

JaxMe Java/XML绑定的实现 Java

Taglibs JSP Tag库 Java

HttpComponents HTTP访问控件 Java

ECS 辅助生成标签(Element Construction Set) Java

WSIF WebService调用(Web Services Invocation Framework) Java

SOAP SOAP标准实现 Java

Woden WSDL书写工具 Java

Tuscany 简化SOA开发 Java

MIRAE 让手机支持基于XML的服务 Java

BSF 脚本语言框架(Bean Scripting Framework),支持JavaScript等多种脚本语言 Java

BCEL 用于直接生成字节码(Byte Code Engineering Library) Java

POI 存取Office文档 Java

Batik JAVA的SVG实现 Java

Attributes 访问Java 1.5语言中定义的meta 这些项目都在jakarta commons中,都是Java的

BeanUtils 反射支持

Betwixt XML/JavaBean转换

Chain 职责链模式实现

CLI 命令行参数解析

Codec 通用加密/加密算法

Collections Java容器类完善扩充

Configuration 各种来源配置文件存取

Daemon Java模拟Unix的Daemon

DBCP 数据链连接池

DbUtils JDBC辅助类

Digester XML到Java对象映射工具

Discovery 根据名称来查找资源

EL JSP 2.0 表达式标准实现

Email 发送Email类

FileUpload 文件上传辅助类

HttpClient HTTP客户端

IO IO操作辅助类

Jelly 基于XML的脚本引擎

Jexl JSTL 表达式语言扩展

JXPath 用XPath语言来操作对象的辅助类

Lang java.lang.类扩充

Launcher 跨平台Java应用启动器

Logging 不同Log实现的封装

Math 数学、统计辅助类

Modeler 创建兼容JMX标准的MBeans

Net 各种网络协议实现

Pool 对象池

Primitives 很小的Java原始对象类型操作辅助类

SCXML 状态图XML标准实现

Transaction 多层次容器、文件操作事务支持

Validator 用XML定义校验器和校验规则

VFS 虚拟文件系统用于操作FTP、SMB、Zip等

Compress tar、zip、bzip2压缩格式文件操作 这些项目都在jakarta commons中的Sandbox中

CSV CSV文件格式支持

Exec 外部进程执行和环境设置辅助类

Finder 模拟Unix find命令

I18n 国际化辅助类

Id 生成ID辅助类

Javaflow 应用状态管理

JCI Java编译器接口

OpenPGP OpenPGP封装

Pipeline 管道辅助类用于并行或者顺序操作数据

Proxy 动态代码生成辅助类

Cache 对象缓存服务 这些项目都在jakarta commons中的Dormant(睡眠)中

Clazz class操作和反射操作

Contract 契约编程用到Java中

Convert Java对象类西转换辅助类

Events 事件管理容器

Feedparser RSS和Atom实现

Functor 用对象方式来操作函数

JJar Jar操作

Latka HTTP功能测试

Mapper 简单封装后可以选择不同的对象映射实现

Messenger JMS用于Web开发中的辅助类

Resources 国际化资源信息查找

Scaffold Web应用开发工具

ThreadPool 线程池

Workflow 工作流管理系统框架

XMLIO XML配置快速简便导入


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/483885.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-09
下一篇2023-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存