本文记录最近完成的一个通用实时通信客户端的架构。

背景


我们公司是做税务相关的软件,有针对大客户 MIS 系统,也有针对中小客户的 SaaS 平台。这些系统虽然都是 B/S 的,但是也需要使用 ActiveX 控件来调用本地的硬件设备打印相关的发票。
由于 ActiveX 控件只能在 IE 下使用,而且在为客户部署时,经常会出现各种各样的问题。所以 SaaS 平台在推广时,不能不配备一个相应的实施团队,为每一家客户解决这些问题。
为了更好地控制本地硬件资源,对接税控设备。我们决定开发一个统一的独立的客户端软件。这样,客户在使用我们的 SaaS 服务或 MIS 系统时,只需要在开票机中下载一个轻量级的客户端,安装后,该客户端会与服务端保持实时的连接,并以托盘的形式静默地在开票机器的后台长期运行。这样,其他的使用者就可以继续使用浏览器中的网页,远程控制这些开票机进行开票了。
客户端产品在公司的名称为 VICA(增值税发票客户端助手)。以下将使用该名称。

架构目标


  • 通用性
    VICA 需要同时适配公司的所有 B/S 产品。接口方面要比较通用。
    一切需要调用本地资源的功能,都可以通过 VICA 来完成。
  • 平台化
    由于公司的产品种类较多,需要调用本地资源的功能也比较多,有打印纸质发票、开具电子发票、抓取本地数据、调用局域网服务等……
    所以要求 VICA 实现平台化、插件化。VICA 本身只专注于更加底层的功能,如插件框架、长连接、自动重连、自动升级、通用提示、命令框架。而业务功能则都实现为相应的插件。这样,在不同产品的应用场景中,开发者可以选配不同的功能插件即可完成基础功能的搭建。另外,开发者还可以基于统一的开发规范,编写出更多适合自己业务的功能插件。
  • 三高
    VICA 是需要作为 SaaS 平台的客户端的。而 SaaS 平台作为互联网应用,其用户数是非常多的。所以 VICA 也需要支持“三高”:高并发、高可用、高性能。
  • 接口要求
    VICA 是一个内部产品,不直接对外。它的直接使用者,其实是各产品线中的开发人员。所以我们需要一个可以适配各产品线的接口。
    目前公司的产品基本都是 .NET 来进行研发的,而且 MIS 产品也不需要部署过多的服务或应用,所以 VICA 在服务端需要能提供 .NET SDK。
  • 部署要求
    VICA 的服务端程序有一定的部署要求:
    在 SaaS 中需要可以独立部署、独立扩展;
    在 MIS 中需要可以独立部署,也需要能够和 MIS 集成在一起部署。
  • 简单
    VICA 对于客户而言,一定要保持其简单性。理论上,使用者只需要下载安装运行后,就很快隐藏到托盘,没有过多功能。这样,一是越是简单的功能,越不容易出错,需要更新的频率也就大大降低了。二是对于客户来说功能越少越好,这样不但易用,而且客户更加不易感知客户端的存在,这样他们更加注重浏览器端的配套的功能。
  • 静默
    由于在一些场景下,VICA 是运行在长期无人值守的开票机上,所以 VICA 中的所有功能,都应该是尽量不需要与用户交互的。
  • 自动升级
    作为一个客户端,自动升级的功能是必不可少的。这是该软件能逐渐成长的基础。
    对于自动升级,我们要求在服务端能控制所有客户端是否需要强制升级,并支持静默升级。

技术选型


  • 客户端技术选型

客户端选型比较简单,当前我们的队伍中只有 .NET 和 JAVA 人员。而在客户端开发方面,.NET 要更加方便一些。另外,我们需要支持 XP 以上的系统,所以我们选择了 .NET 4.0 版本,该版本可以支持 XP SP3 以上的系统。另外,为了方便后期做出更加美观的界面,所以我们选择了 WPF 界面技术。

  • 服务端技术选型

服务端实现实时通信的框架中,Node 以高性能著称,我及团队内部一些同事也都有 Node 的开发经验。但是最终我们还是决定使用 .NET 平台以及一些开源组件来开发一套自己的高性能实时通信框架。原因如下:

  1. 我们需要将 VICA 服务端与 MIS 系统集成部署。
  2. 需要易用的 NET SDK。
  3. 我们的客户端是基于 Socket 连接,而非 WebSocket。所以二者皆可。
  4. Node 的高性能 主要依赖于其单线程、异步非阻塞模式:“为了能适应高并发的情况(成千上万的连接),你的服务器需要采用异步非阻塞模式。你可能已经在IO操作中实现了这种方式。但问题是,如果你的服务器代码的任何部分可能产生阻塞,你都需要开启一个线程。在这种级别的并发下,你不能去为每个连接创建线程。所以整个代码路径都需要异步非阻塞式的, 不仅仅在输入输出层。”。所以,我们需要在 VICA 服务端代码中,所有会造成线程阻塞的代码,都需要使用异步接口(如 IO 操作、MQ 的访问、远程服务的调用等)。

物理视图


上图以 VICA 在电子票应用中集成部署的场景,示例了物理部署后的重要组件:

浅黄色的两个组件,就是 VICA 平台。

浅绿色的组件,是基于 VICA 平台编写的插件。上图中,该插件完成了电子票的开票功能。

橙色部分,是电子票应用的业务相关组件。

逻辑视图


上图是 VICA 中的逻辑视图,描述 VICA 平台所提供的功能,以及客户端、服务端集成 VICA 时的调用关系。

  • Server:服务端;
  • DBEN.EI:电子票相关的业务组件。
  • DBEN.VICA.Server:VICA 在服务器端的一些基础组件。以 SDK 的形式提供给开发者。
  • WPFClient:WPF 客户端;
  • DBEN.VICA.ClientUI:客户端 UI 壳。
  • DBEN.VICA.Client:客户端一些通用功能类库。
  • DBEN.VICA.InvPlugin.UI:开票相关的界面插件,与 DBEN.VICA.InvPlugin 是配套的,不过这个插件只在客户端使用。
  • DBEN.VICA.InvPlugin:开票相关的业务插件,其中包含了发票相关的一些命令及逻辑。这个包会被客户端、服务端同时使用。
  • DBEN.VICA.Platform:VICA 平台所提供的功能。含:插件框架、通信框架、IOC容器、命令框架等基础组件,以及一些通用的内置命令,如登录命令。

通信框架 UML 图


通信框架是 VICA 中最核心的功能。

类图:

序列图:

命令框架 UML 图


命令框架在通信框架的基础上,使用命令模式,将客户端与服务端的通信、行为封装为易用的单个的命令,方便上层开发者对业务逻辑的封装、以及对通信框架的使用。

类图:

序列图:

小结


本篇是 VICA 架构设计的第一篇,只简单介绍了 VICA 的内部静态、动态结构,以及核心/基本功能的实现。

下一篇将会介绍 VICA 如何实现“三高”。

VICA 架构设计(1)相关推荐

  1. AI中pass架构设计优化

    AI中pass架构设计优化 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,例如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠 ...

  2. NVIDIA Turing Architecture架构设计(下)

    NVIDIA Turing Architecture架构设计(下) GDDR6 内存子系统 随着显示分辨率不断提高,着色器功能和渲染技术变得更加复杂,内存带宽和大小在 GPU 性能中扮演着更大的角色. ...

  3. NVIDIA Turing Architecture架构设计(上)

    NVIDIA Turing Architecture架构设计(上) 在游戏市场持续增长和对更好的 3D 图形的永不满足的需求的推动下, NVIDIA ®已经将 GPU 发展成为许多计算密集型应用的世界 ...

  4. 最全面的缓存架构设计

    一.缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...

  5. GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

    在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...

  6. Asp.Net开发架构设计(二)

    上回说到,我们配置了一下UnityConfig层,在这个层中定义了一个IContainerAccessor的接口和一个返回IUnityContainer类型的方法,这个方法的主要作用就是把Servic ...

  7. web架构设计经验分享

    本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查 ...

  8. 架构设计复杂度的6个来源

    谈到架构设计,相信每个技术人员都耳熟能详.我总结了三个架构设计相关的特性: 架构设计的思维和程序设计的思维差异很大. 架构设计没有体系化的培训和训练机制. 程序员对架构设计的理解存在很多误区. 所以, ...

  9. 你必须了解的微服务架构设计的10个要点!

    近来,几乎人人都在谈论微服务.微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境等.本文将介绍微服务架构设计中的一些要点. 微服务架构设计时有哪些要点 ...

最新文章

  1. 【连载】优秀程序员的 45 个习惯之习惯25
  2. Linux下编译安装Apache、php和svn
  3. IOS sqlite数据库增删改查
  4. Xorequ(BZOJ3329+数位DP+斐波那契数列)
  5. ITK:二维高斯混合模型期望最大化
  6. jvm(4)-虚拟机性能监控与故障处理工具
  7. android 推送的小图标,android - 推送通知中没有声音并且没有自定义的小图标 - 堆栈内存溢出...
  8. 疫情之下,计算机仿真程序告诉你,没事别乱出门!企业复工务必做到八个“一”...
  9. jquery学习之$(document).ready()
  10. 7.3 超标量流水线
  11. Map集合常见面试题
  12. app invento2r wxbit版 快速开发简单蓝牙上位/蓝牙串口助手
  13. 京东的焦虑:强制996,高管离职,奶茶风波...
  14. Unity 图片字体制作
  15. VC中GDI绘图技术基础知识:hdc设备环境句柄,坐标系
  16. 文件服务器异地容灾,三种异地容灾方案(完整版).pdf
  17. SDH原理--1.SDH概述
  18. 第三周总结(2022.10.31~2022.11.4)
  19. 手机呼叫转移怎么设置
  20. 指纹算法中控 X638考勤机编程(delphi)

热门文章

  1. 计算机替换字体怎么操作,电脑替换文字怎么操作
  2. shell 补齐路径_Linux中10个有用的命令行补全例子
  3. mysql火焰图_【性能】如何使用perf和火焰图分析系统性能?
  4. 意志力实验:5分钟训练大脑冥想--自控力
  5. Spring Boot使用EasyExcel导入导出Excel
  6. 微信 米聊 导游 服务器 李白,【文化】千古“第一导游”,我只服李白!
  7. 一季度险资137亿建仓151股 业绩环增公司超四成(转自新浪)
  8. 情人节主题的公众号图文排版怎样设计最走心?
  9. Java网课基础笔记(20)19-08-02
  10. mybatis plus 看这篇就够了,一发入魂