分享

关于多线程的一些思考

 liang1234_ 2018-03-16
1.多线程的无顺序性
比如上游给的文件,他们需要你处理完,还是按这个顺序给他们,不能乱序了。因为他们这个文件可能来自多个系统。
这个方式可以:在读的时候按线程序号分配数据,然后内部顺序自己保证。而在写文件的时候,也要按照线程号的顺序来写,不能乱。

2.还有就是,同一个客户多条数据,需要按顺序入最新的那条,而不是随意一条。这种就比较麻烦,最好上游再导出数据的时候把垃圾数据处理掉。(这也类似与重复数据问题)
还有就是:宁波那时候的处理方式,前提他们给的文件要有顺序,即同一个客户的信息一定是在一起的。那么在读数据的时候,可以按客户数来算做批次在生产者里读入。

还有就是(就是批量里面的任务防重复执行):在多线程处理的时候,同一个集合set,没个线程都将在处理的数据里set到这个集合里,set不到的就是有同一个客户的重复数据正在处理,这个时候等待,能set进去之后再执行这条数据。这样的话肯定就不会出现多条数据的情况。
下面这三种结构都可以:


最后,终极解决方案:
上面的可能在去重的时候,无法方便的选择哪一条,比如说选最新时间的,但是最新时间又没有存到数据库里,这样也就不太好做比较了。而数据库我们又不想多加一个临时字段或者用备注字段。
而此时就必须大招了,直接用切分文件的方式,全部在内存中做,不和数据库打交道。
这样做的好处:可以方便的比较,同时也和数据库业务解耦了,直接做成一个前置小功能,拿到哪里都可以用。

3.还有一种并发,容易被忽略
就是如何将某张主表中的P、O约束,改成1、2?
常规操作直接改,是会有很大问题的。
两点:
第一,主表,数据量大,直接刷事务会很大,可能会影响正常的联机交易;
所以需要分拆成小事务来刷,分批刷。
第二,有个并发问题,直接刷成1、2,怎样保证全部刷掉? ——没有办法保证,除非暂停开户交易。
a.如果不停止交易,需要分两步做:首先,改成PO12,然后程序上线,再刷一遍PO,同时程序也要兼容。
事实上这样操作很麻烦,程序还要兼容。
b.然后就是,暂停开户服务的方式;
这种需要个机制:当有这种变更,先刷一批,这时候还有新的进来,然后暂停服务,把新进来的刷掉,然后开启新服务,这个新服务是1、2的。———这种说法是有问题的。
应该在整个刷的过程中,都应该关停所有服务,否则,就会有问题。
c.其他方式,架构不同,即把库分库,分成小库,这样一个小库一个小库刷,这样就像是把大事务切成小事务,影响变小。
d.通过操作主备库的方式
即,需要关停维护交易,关停主库所有的服务,同时也关停同步备库的同步,只提供备库的查询,这样即可只刷主库,怎么刷都行,怎么快怎么来。刷完之后,打开主库,将程序切回主库,打开同步备库动作。
同时在暂停维护交易,要有友好的提示。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多