Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【转载】系统设计 | 基于读者反馈的补充更新 (1)

2024-03-04 1124点热度 0人点赞 0条评论

系统设计 | 基于读者反馈的补充更新 (1)


写作的价值不仅仅是传播想法,更在于总结和反馈。系统设计系列收到了一些读者的反馈和补充,定期整理更新。

时间方案中补充频率表达格式

在 《系统设计中需要考虑到的时间问题》文章中我们讨论了时间的标准化表达格式,在其中提到了 ISO-8601 规范。

其实 ISO-8601 中有非常多很有价值的表达方式,只不过使用不够频繁没有拿出来讲。我们应该尽可能使用现有的规范来实现业务,可以少走一些弯路。

在 ISO-8601 中,时间段表达法非常有用。如果我们需要做一个会议、日历系统,需要表达会议周期,在保险、金融行业,也需要表达期限,同样需要类似的数据格式,否则需要存储为多个字段。这时,我们可以使用时间段格式。

例如,P1Y3M5D 可以表达为 1 年 3 月 5 天,P1Y3M5DT6H7M30S 可以表达 1 年 3 月 5 天 6 小时 7 个月 30 秒。

在 Java 中可以使用 Period 这个类来解析出相关信息,而自己定义的格式通用性、拓展性都不好。

相关文档说明:

 

系统设计 | 基于读者反馈的补充更新 (1)

 

服务器推技术补充 SSE 推送

在《实时协作应用的设计》一文中,我们讨论了很多服务器推送的技术,在文章发出后,收到反馈:还有一种叫做 SSE 的技术可以选用。

SSE 的全称是 Server-Sent Events,中文叫做服务器推送事件。

相对于 WebSocket 来说,SSE 其特点是单向通道,只能由服务器向浏览器发送。本质是一个基于 HTTP 未关闭的下载流,所以无法实现双向通信。如果需要往服务器发送信息,则需要发起另外一个 HTTP 请求。

目前几乎所有现代浏览器原生支持,且被定义在 HTML5 规范中,其传输的媒体类型为 text/event-stream。

由于其简单的特性,SSE 有相比 WebSocket 的优点:

  • 充分利用 HTTP 协议,不用拓展新协议。
  • Webflux 等响应式框架都支持 SSE,实现成本极低。
  • JavaScript 原生 API 容易使用。
  • 使用文本传输数据,方便调试和开发。
  • 消耗资源较少。

在合适的场景下,SSE 是一个不错的服务器推送方案选择。ChatGPT 发送文字的方式就是采用了 SSE,可见其效果。

DSL 补充案例

在《设计和解析 DSL》中,邓老师(研讨会分享者)分享了他使用 DSL 语法设计了一套比较通用的表达搜索、过滤的语法,在不增加后端开发工作量的情况下完成条件过滤的开发逻辑。

项目参考:https://github.com/bobdeng/dslquery

该项目的 DSL 示例:

(or(and(field equal value)(fieldb greaterthan value))(or(fieldc lessthanorequal value)(fieldd notequal value)))

在这个项目中作者自己实现了字符串解析,没有使用解析器生成工具。另外值得一提的是,存在一个标准用来表达 eq、notequal 等语法,这类语法被使用得比较普遍。

这个标准叫做:SCIM Query syntax

参考文档:https://bookstack.soffid.com/books/scim/page/scim-query-syntax

RFC 文档:https://datatracker.ietf.org/doc/html/rfc7644#section-3.4.2.2

高精度计算相关库

在《高精度计算》中,我们讨论了 Java 中 BigDecimal 的原理,以及如何安全的使用 BigDecimal,经朋友反馈,补充了一些可以参考的类库:

  • NumberUtils https://commons.apache.org/proper/commons-lang/
  • https://commons.apache.org/proper/commons-math/
  • https://www.joda.org/joda-money/
  • https://java.net/projects/javamoney/pages/Home
  • https://github.com/eobermuhlner/big-math
  • https://www.quantlib.org/

导入和导出补充

在《导入和导出》中,我们讨论了应用系统如何实现数据的导入导出。对于 PDF 导出的技术方案,这里补充另外一种实现方式。

即:通过 HTML 模板编写页面,并通过模板引擎获取渲染后的 HTML 页面,再将其转换为 PDF。

其优点是可以更加灵活的排版。

在 Java 中可以采用 FreeMaker 作为模板引擎,使用 openhtmltopdf 这个库实现 PDF 生成。

该库通过封装 pdfbox 实现 PDF 操作,支持 CSS2.1、SVG和Base64图片等常用功能,且 License 开放,可以代替 iText。

补充流程引擎、规则引擎、公式引擎区别

在《处理业务公式》我们讨论了公式引擎,因此在反馈中衍生出规则引擎、流程引擎的概念。

这三个概念有一定程度的重叠,但是边界还算清晰。补充如下:

  • 公式引擎:用于执行一段表达式的工具库,一般用于求值,有些可以支持一些 if 语句,可以作为规则来使用。
  • 规则引擎:在满足一些条件时,出发一些规则,也可以通过配置文件进行编排。例如 Drools、LiteFlow。
  • 流程引擎:用于编排系统之间的能力,用于系统集成、审批,一般支持 BPM 等模型。例如,Flowable、Activiti。

其它参考材料

部分参考链接已经贴在文中,补充其它有用的参考材料如下。

[1] Server-Sent Events 教程 https://www.ruanyifeng.com/blog/2017/05/server-sent_events.html

[2] https://www.baeldung.com/spring-server-sent-events

[3] https://bookstack.soffid.com/books/scim/page/scim-query-syntax

-END-


文 | 少个分号 (转载请注明出处)

关注公众号:DDD和微服务

 

本文仅供学习!所有权归属原作者。侵删!文章来源: DDD和微服务 -shaogefenhao :http://mp.weixin.qq.com/s?__biz=MzA4Mzc2MzcyMQ==&mid=2247484890&idx=1&sn=a104193144af159379112c80f5e791d6&chksm=9ff032bca887bbaa009f8ec4d24aba7178900006173f99189e24e10852a032686e01d60e1ca6&scene=21#wechat_redirect

更多文章:

  1. 系统设计 | 哪些技术标准可以帮助系统设计?
  2. 系统设计 | 设计和解析 DSL
  3. FSM-COLA无状态状态机
  4. 实现一个状态机引擎,教你看清DSL的本质
  5. 你所说的“事件驱动”是什么? What do you mean by “Event-Driven”?
  6. 系统设计入门:成为高级软件工程师的指南
  7. 系统设计 | 导入和导出
  8. 系统设计 | 处理业务公式
  9. 生产环境JVM崩溃问题排查解决
  10. 系统设计 | 如何表达技术架构?(规划篇)
标签: 转载 系统设计 架构方案
最后更新:2024-03-03

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • 时间方案中补充频率表达格式
  • 服务器推技术补充 SSE 推送
  • DSL 补充案例
  • 高精度计算相关库
  • 导入和导出补充
  • 补充流程引擎、规则引擎、公式引擎区别
  • 其它参考材料
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
事务异常:Transaction rolled back because it has been marked as rollback-only 系统设计 | 高性价比的测试策略("瓜藤"比喻) 优秀开源软件的类,都是怎么命名的? 这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等 如何让Java编译器帮你写代码 ElasticSearch之各大版本演进,发布8.0.0 Alpha 2版本 浅谈SQL优化小技巧 JVM 内存分析工具 MAT 的深度讲解与实践——进阶篇(长文)

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x