开源流媒体云视频平台EasyDarwin中EasyCMS服务是如何进行命令转发和消息路由的
EasyCMS介绍
EasyCMS做为EasyDarwin开源流媒体云平台解决方案的一部分,主要进行的是设备的接入和Session(DeviceSession & ClientSession)管理,同时用户也可以复用做为其他类型项目设备接入与管理的框架,EasyCMS也源于EasyDarwin服务架构,具备一套完整的网络I/O框架以及Utility,开发者很容易在EasyDarwin的基础上开发跨平台服务程序,例如Windows、Linux、Mac、Solaris等系统平台,只要一次熟悉,将会受用终身;
EasyCMS目前在系统中的一个主要功能就是接收EasyClient客户端的RESTful接口请求,然后内部查找对应的具体设备Session,将控制命令(如开始视频直播推送、PTZ动作命令、停止直播流等)通过查找到的DeviceSession发送到具体的设备,DeviceSession收到设备命令的响应后,还需要将响应中的数据结果返回给对应的ClientSession,再由ClientSession响应给客户端设备;
问题描述
如何进行高效率的消息路由,一直是我们在讨论的问题,这里面涉及到几个问题:
1. 服务器如何在内部维护大量已发出的消息请求?
2. 消息响应如何回调反射到对应的ClientSession?
3. 消息超时不响应,EasyCMS服务器中消息请求如何释放,ClientSession如何超时释放?
我们原来的构思中,在每一个DeviceSession中维护一个已发送消息的MsgQueue,其中的每一个Element为一个包含:消息源ClientSession、消息内容、消息Sequence的结构单元,消息发送出去之后,MsgElement将加入DeviceSession::MsgQueue队列,当设备有具体的消息响应之后,再根据具体的消息Sequence遍历查找DeviceSession::MsgQueue队列,找到对应的MsgElement,再通过MsgElement::ClientSession将响应结果发送给客户端;
看似整个设计流程是比较合理的,也解决了消息路由的问题,但是这里会有几个比较严重的问题:每一个DeviceSession维护一个MsgQueue,在系统设备量和客户访问量巨大的时候,可能每一个DeviceSession会维护一个很长的MsgQueue,那么在有消息响应的时候,查找对应的MsgElement就会非常耗时好效率,而且对超时没有得到响应的MsgElement,我们需要定期遍历维护MsgQueue进行处理,或者如果每一个MsgElement都加一个定时器,自己从Queue里面释放自己,释放流程也是非常复杂的;
解决方案
考虑到维护Queue在设备和客户端并发比较高的时候必然会造成非常大的效率消耗,我们通过在EasyDarwin云平台的协议的字段中加入From、Via、To字段来解决这个问题:
1、当ClientSession通过DeviceSession向设备发送命令时:
From: <ClientSession SessionID>
Via: <EasyCMS ServiceID>
To: <DeviceSession SessionID>
2、当设备响应DeviceSession下发的命令时:
From: <DeviceSession SessionID>
Via: <EasyCMS ServiceID>
To: <ClientSession SessionID>
3、当DeviceSession收到响应后,根据To字段对应的ClientSession SessionID,在当前EasyCMS中维护的ClientSessionMap中查找对应的ClientSession,找到后,通过ClientSession进行具体消息的响应,ClientSession为自我维护一个Session的超时时间,超时时间内,没有任何数据请求或者发送的需求,ClientSession会自动析构,所以,如果根据ClientSession SessionID查找不到对应的ClientSession,该消息将自动丢弃;
4、在可靠的消息路由系统中,可以将发送的消息和收到的消息都入库到数据库中,进行消息的再次发送和响应的追溯;
那么按照上面的流程,系统能够非常高效地处理用户的请求和设备的消息,避免了大量的锁处理,结构简单,且可扩展性非常强;
获取更多信息
Github:https://github.com/EasyDarwin
Copyright © EasyDarwin.org 2012-2016

开源流媒体云视频平台EasyDarwin中EasyCMS服务是如何进行命令转发和消息路由的的更多相关文章
- EasyDarwin幼教云视频平台在幼教平台领域大放异彩!
在之前的一篇方案<基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案>中,我们提到一种可以广泛应用于幼教.工厂.建筑工地以及各种现场监控的云视频平台方案,这种 ...
- EasyCamera Android安卓移动视频监控单兵设备接入EasyDarwin开源流媒体云平台
前言 随着Android系统的不断更新和发展,现在越来越多的硬件产品选择用安卓系统作为运行环境,电视机,机顶盒.门禁.行车记录仪.车载系统.单兵设备等等,Android系统底层还是Linux,但对上层 ...
- EasyDarwin开源流媒体云平台之语音对讲功能设计与实现
本文由EasyDarwin开源团队成员Alex贡献:http://blog.csdn.net/cai6811376/article/details/52006958 EasyDarwin云平台一直在稳 ...
- EasyDarwin开源流媒体云平台设计与实现(分布式+负载均衡)
前言 早在2013年我就设计了一套架构非常简单的分布式流媒体服务器平台<基于Darwin实现的分布式流媒体直播服务器系统>,当时的考虑如今看来有诸多的细节点没有考虑到:1.CMS是单点部署 ...
- EasyDarwin开源流媒体云平台支持EasyCamera摄像机、EasyCamera手机直播监控、EasyNVR等多终端接入
云平台架构 EasyDarwin开源流媒体云平台目前已经包括了EasyCMS中心管理服务.EasyDarwin流媒体服务.EasyCamera设备端(支持Arm_Linux.Android.PC).E ...
- 基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案
一.方案介绍 1.1.方案背景 在2016年10月25日至28日的安博会上,我们看到了不少的幼教平台厂商,我们注意到大部分的幼教平台,为了追求极佳的用户体验,在微信或者APP端能够做到极快的打开速度, ...
- EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计
需求背景 EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录 ...
- (转)初试 Netflix 开源持续云交付平台 Spinnaker
目录 Spinnaker 介绍 环境.软件准备 安装 Development Spinnaker 配置依赖环境 配置并安装 Spinnaker 演示 Spinnaker Pipeline 演示 Spi ...
- EasyDarwin开源流媒体音视频云平台遇到的奇葩问题:内网运行正常,公网流媒体不通
最近在帮助EasyDarwin的用户部署EasyNVR+EasyDarwin云平台+EasyClient方案的过程中,遇到一个问题,EasyNVR分布在用户各地区现场的内网中,EasyDarwin云平 ...
随机推荐
- 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..
https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...
- luogu 2735 电网 皮克公式
题目链接 题意 给定一个格点三角形,三个顶点分别为(0,0),(n,m),(p,0),求三角形内部的格点个数. 思路 皮克公式: \[S = \frac{i}{2}+b-1\] \(S\)为三角形面积 ...
- HDU 1394:Minimum Inversion Number(树状数组,线段树)[水]
题意:有0~n-1这n个数,以一定的排列.这个排列可以循环,就是可以把第一个拿到最后,然后形成新的排列.问这些排列中的逆序对最小值. 思路: 最后的循环,拿走一个之后,新的逆序对数 newsum = ...
- 微信小程序 使用微信支付功能实现在线订单支付
以前做过PC页面微信支付,但是这次在小程序 直接调用微信支付功能还是方便很多 先放个微信官方API链接:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_a ...
- python 当pip不能用的时候可以去找python安装包
初学python,一直pip安装各种包,突然间有一天pip莫名其妙不能用了,除了pip help全部都是没反应 百度好像没人出现过pip挂掉的情况 花了一小时修复pip,卸载啊,路径啊,全部无效 百度 ...
- Codeforces 691F Couple Cover
可以暴力预处理出每一种小于3000000的乘积有几种.询问的时候可以用总的方案减去比p小的有几种o(1)输出. #pragma comment(linker, "/STACK:1024000 ...
- 公司内部技术分享之Vue.js和前端工程化
今天主要的核心话题是Vue.js和前端工程化.我将结合我这两年多的工作学习经历来谈谈这个,主要侧重点是前端工程化,Vue.js侧重点相对前端工程化,比重不是特别大. Vue.js Vue.js和Rea ...
- SSM框架CRUD小案例
1.数据库准备 部门tbl_dept 员工tbl_emp 建立员工和部门的外键 2.在IDEA创建SSM项目环境 2.1配置Web模块 最上面的图是错误示范,注意!!! 在Tomcat配置了项目路径, ...
- 项目心得——按照指定的日期/时间创建Date对象
项目心得——按照指定的日期/时间创建Date对象 有时,在做项目中,需要获得指定日期的Date对象,这个指定的日期或者时间可能不是当前的时间.下面讲解两种获取指定日期/时间的Date对象的方法: pa ...
- PHP平均小数红包算法
<?php function RandMoney( $money,$num ){ $arr = array();//存放金额 $total_money = 0;//红包总金额 $thisMone ...