名词解释

  1. websocket:

WeSocket是一种协议,与Http是一个等级的,并且也是基于TCP协议,可以理解为WebSoket是Http的优化,常规的场景下,一般都是由客户端使用HTTP发送一个Request,对应的服务端接受到Request请求后进行处理并返回Response给客户端进行响应,这是由客户端主动发起的,服务端无法控制这个时机,如果客户端需要长时间的刷新数据的话,传统的方式就要考虑使用ajax轮询这样的策略进行循环调用HTTP,并且一次HTTP请求完整流程需要进行三次握手和四次挥手,十分低效且耗费资源。
Websocket对上述的问题进行了改进,复用了HTTP的握手通道,客户端和服务器只需要完成一次握手,建立起长连接之后客户端和服务端就可以进行双向数据通信,详情查看
原文链接:https://blog.csdn.net/qq_42125556/article/details/120931552

  1. http:
  2. 拉取数据:
  3. 推送数据:
  4. rest:
  5. webservice:

项目场景:

提示:这里简述项目相关背景:

A系统是民航领域面向所有机场(现有248家机场)和航司(现有53家)以及货代(现有2000多家)的提供数据服务的平台。机场、航司和货代可以通过平台实现数据交换和共享。


现有系统主要硬件环境

采用SOP(面向对象)的开发方式,所有硬件全部架构在华为云上,使用华为云的elb负责负载均衡,每个服务(或者叫子系统)均有2个节点(即双活),后台数据库采用PG,使用了redis cluster集群技术。

现有系统中间件

除以上硬件环境外,A系统采购了华为云的kafka中间件,各个子系统之间的公有数据同步,采用的是kafka技术。

问题描述

提示:这里描述项目中遇到的问题:

用户提出希望可以平台主动推送其想要获得的数据,而不是他们主动来获取


而且要求满足以下功能
1、需要有权限管理,不能任何客户端都可以从平台拿数据
2、客户端不能安装任何额外的工具,尽量是通用的
3、客户端需要与服务器保持长时间通讯,但是不能消耗太多网络资源
4、可以重复消费,如果推送失败可以再推
5、不同的客户端消费者可能订阅不同的数据
6、服务端有权利更改那些数据给那些客户端


方案选择

这里不写最终方案,写一下方案选择的过程,把一些坑和思考写出来,这样我觉得比直接上代码给最终方案更能给大家帮助

从kafka、websocket、redis订阅、rocketmq一直在探索,各种工具比较。考虑了客户端可能有各种不同的场景


Kafka订阅模式:

前文所述我们购买了kafka华为云产品,且一直在用因此,想能不能改改继续使用,但是要解决前面问题描述中的提出的要求,其中最难解决的是1 3 5

  • 解决问题1“需要有权限管理,不能任何客户端都可以从平台拿数据”
    方法:

  • 解决问题3“客户端需要与服务器保持长时间通讯,但是不能消耗太多网络资源”
    方法:kafka用的是tcp通讯协议

Kafka的Producer、Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议

  • 解决问题5“不同的客户端消费者可能订阅不同的数据”
    方法:Kafka版支持对Topic进行ACL(Access Control List)权限管理,可以在Topic中为不同的SASL_SSL用户设置不同的权限,以达到SASL_SSL用户之间的权限隔离。

  • 解决问题2“客户端不能安装任何额外的工具,尽量是通用的”
    方法:kafka的解耦就是对方linux或者windows服务器哪怕是pc机都可以,无所谓的

  • 解决问题4“可以重复消费,如果推送失败可以再推”
    方法:用kafka的offset参数,可以配置位移,理论上没有故障时,消费者的这个offset是自动设置的,如果有问题不准了,那么消费者可以自己设置offset位移,去kafka的分区中那个位置取数据

  • 解决问题6 “服务端有权利更改那些数据给那些客户端”
    方法:我们要把topic和问题5的解决方法结合起来用,首先topic要划分好,我们是以参与该平台的用户分为消费topic和上送topic,因为每个人都有可能上送数据给别人也可以从被人那里获取数据,且所有数据都必须消费到平台管理者。因此我们把所有上送topic的权限配送给平台管理者,而所有消费topic配送给自己的用户。在往所有消费topic送数据之前,先判断一下后台配置表,是否这个类型的数据,被授权给了这个消费用户,如果有授权那么就给放到他的消费topic中,反之没有。

Kafka订阅模式+websocket:

通过讨论发现3这个问题(客户端需要与服务器保持长时间通讯,但是不能消耗太多网络资源),好像websocket可以解决,所以websocket提上日程。

WebSocket看成是一种类似TCP/IP的socket技术;此socket在Web应用中实现,并获得了和TCP/IP通信一样灵活方便的全双向通信功能。
WebSocket协议由RFC 6455定义。协议分为两个部分: 握手阶段和数据通信阶段。
最后我们发现kafka本身的通信就是TCP的socket技术,且具备一次握手长期有效的特点,就逐渐放弃了kafka+websocket的方式,但是的确有这么玩儿的,请参考如下链接:
kafka和websocket实时数据推送

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐