主题:主题:规则引擎开发规范--规则配置类规范<连载5>

2.3. 内存表的子线程相互间的内存共享
如果内存表在主线程中创建,在子线程中共享调用时,可以采用上述的共享方式来调用。但是当多个子线程中,如果需要进行一些数据共享时,那么就不能采用共享方式。
因此我们现在假设有这两类子线程:
1、 内存表数据更新线程
2、 使用内存表数据的线程
比如我们需要批量对订单数据进行折扣计算,在根据订单数据进行运算的子线程中,要根据产品信息、产品定价信息、产品报价信息、产品折扣配置等信息进行处理。除了订单信息是本次运算时需要从数据库中获取的,其他的相关信息,如果每次都从数据库中读取,就太消耗资源。
因此我们希望内存表数据更新子线程,可以事先将这些数据保存到共享内存表中。折扣计算子线程需要用到这些配置信息时,只要从共享的内存表信息中读取就可以了。以下分别描述几个子线程需要完成的动作。
内存表数据更新子线程:
1、 从数据库从读取最新的数据。存储到当前的进程的共享内存池中。
2、 如果配置了支持基于文件共享,那么在将内存表存储到共享内存池中时,同时会在指定的目录下,将内存表序列化到文件中。
维护基于文件共享的子线程:
1、 如果配置了支持基于文件共享,那么就会将指定目录下,所有序列化的内存表,读取到共享内存池中。
使用内存表数据的线程:
1、 将当前规则包中内存表的“数据共享”属性设置成“全局单例共享”或者“全局复制共享”
2、 如果是全局单例共享,则会生成一个新的内存表,同时内存表的数据和索引指向共享内存池中的内存表。
3、 如果是全局复制共享,则会生成一个新的内存表并且复制数据,同时索引指向共享内存池中的内存表的索引。
2.4. 内存表操作尽可能拉平处理
采用规则引擎处理业务逻辑时,如果是进行批量数据的逻辑处理,一般都需要采用内存表来记录被处理的数据。此时可能需要对这些批量的数据进行逻辑处理,或者需要根据其他表格进行匹配后,进行处理。
在处理中,我们尽可能将内存表拉平处理,每个计算结果,尽可能保留在表格中,以便于查错等;设计上保留中间数据保存的机制。
比如我们有个计算工资的业务。首先有张员工信息表,记录了员工id,员工名称、员工级别,基本工资等信息。还有一张考勤表,记录了员工id、日期、考勤情况。还有一张工资表,记录员工的id、基本工资、应发工资、所得税、实发工资。
规则的处理步骤一般如下:
1、 汇总考勤数据,统计出员工id、出勤天数、加班天数、缺勤天数。
2、 根据员工基本工资,然后根据出勤天数、加班天数和缺勤天数,计算出员工的加班工资和扣款。
3、 然后根据基本工资、加班工资和扣款,得到应发工资
4、 在根据应发工资扣除所得税,五险一金等,得到实发工资。
在具体的内存表的设计中,可以采用根据这些逻辑,处理以上这个表格。但是这种模式,不便于规则理解和差错。因此我们应该设计一张拉平表,这张表记录了和这个员工计算相关的所有信息。字段如下:员工id、员工名称、员工级别、基本工资、月份、出勤天数、加班天数、缺勤天数、加班工资、扣款、应发工资、所得税、五险一金、实发工资。
这些数据有些并不需要最后返回给系统,但是确实中间计算的值。但是采用拉平表将这些信息存储在一张表中,这样非常便于执行完之后的查看等。特别是将这张表,导出成Excel,非常便于业务人员进行差错。很容易知道是哪个规则在哪一步发生了错误。

猜你喜欢

转载自silencelight.iteye.com/blog/2294777