目前需要开发一个数据计算服务。
大致业务:拿到业务数据及当前激活的算法之后,根据业务服务提供的不同数据集,执行计算,最终产生结构相同的结果数据。(单次计算数据量级百万至小千万)
特征:影响计算结果的因素可变、算法可变,输出结果数据结构一致。
最终目的:保证系统扩展能力、具备同步及异步计算。
由于本人对设计模式认识还有所欠缺,暂未思考出比较合适的方案,所以想借鉴一下各位前辈在遇到这类需求的设计思路。
1
kop1989smurf 2023-01-31 18:11:28 +08:00
楼主这个问题的信息量太少。
1 、function 的输出结果稳定是必然的,这是废话。 2 、同步、异步、扩展能力的设计是依照你的“计算”可能性边界而来的。 但楼主通篇没说到底是什么计算,以及需求边界在哪。 最起码要举个范例。 |
2
S4msara OP @kop1989smurf 已经 append 一个例子,不知能否帮助理解
|
3
S4msara OP @kop1989smurf 另外,结合例子单独补充一下关于“同步、异步、扩展能力”我的考虑:之所以需要具备这些能力是为了适应应用在未来版本迭代中的变化,例子对于这部分要求来说还是过于单一、片面,但如果延伸至 BI 系统这类业务更加复杂、交付群体需求更多样的场景,能够具备这些能力对产品的开发和交付能力都将是量级提升。
|
4
learningman 2023-01-31 19:32:42 +08:00 1
策略,你可以加 n 组 middleware 来处理数据,但是不改变数据本身的格式。
再要扩展性就设计个 dsl 。 |
5
k9990009 2023-02-01 10:37:44 +08:00 1
模板+工厂+策略+责任链
以 JAVA 来说下我的实现思路吧 以设备不同分父子类,抽象出计算的接口,抽象模板实现公共的计算接口,增加计算前,计算后的方法。 这里计算前方法主要是用来预处理数据,在计算接口实现时专注于计算逻辑。 不同设备实现不同的模板方法,规则固定的话,计算中配置规则就好。规则动态的话,引入规则引擎,一个链路去执行这些规则。要是有用户在可视化页面去管理规则的话,也可以考虑自己实现一套支持变量运算的简易语法。规则引擎可以看看 QLExpress ,我没用过,我自己根据产品的设计实现带变量的四则运算、文本计算就够用了。 同步、异步看你的场景了。 |
6
litchinn 2023-02-01 16:40:10 +08:00 1
根据实际情况,从简单到复杂的设计 ifelse->策略模式+责任链-> 规则引擎(easyrules ,drools, LiteFlow 等)-> DSL,AST ,再往下抽象就变成编程语言本身了,你在附言中的场景,自己写个规则路由就行了
但是如果需要动态变更规则,序列化规则,提供操作页面给用户等,那么规则引擎是不错的选择 |
7
S4msara OP |