文档章节

基于redis的多线程生产消费模式

罗一鸣
 罗一鸣
发布于 2015/11/20 11:49
字数 1059
阅读 154
收藏 1

订单新旧客状态处理方案优化

一、问题原因

     1、线上发现一个数据问题,在2015年1月12号到2月4号,有一部分订单出现“新旧客”标识与“佣金比例”不匹配。

     2、分析发现问题原因是2月5号上线了新的版本,更改了订单新旧客的判断标准;上线后的代码通过25天同步任务,修改了部分之前25天的“新旧客”状态,但是并没有修改相应的佣金比例。

二、处理需求

     1、由于佣金比例经过了方案修改,无法通过SQL精确查出所有的异常订单,所以需要通过程序遍历所有订单,找出订单之前的新旧客状态,并且进行修改。

     2、订单时间段:1月12号-2月4号

     3、订单量:700W订单

     4、问题订单预估:1W

三、初步方案

      1、处理方案:

         1)首先分页取出当前CPS数据库的所有订单

         2)使用订单号通过order-api按照以前的逻辑,进行判断所有订单的新旧客状态

         3)将上一步判断的新旧客状态与现有数据库里面的状态进行对比,如果有差异,则将差异信息写入redis

         4)将redis里的差异订单,更新到数据库中

      2、程序流程图:

      


3、运行结果:

程序运行后,可以正确更新订单的新旧客状态。但是程序性能出现问题,生产者线程存在阻塞,运行非常缓慢。更新一天的数据需要5个小时,而且越往后越慢。


4、问题原因:

   1)查询CPS库中订单方法有问题,直接对25天的订单进行分页,造成了查询速度缓慢,严重影响了数据库性能。

   2)查询SQL的排序方式有问题,增加了额外的数据库开销。

   3)生产者线程中,采用串行的方式进行查库、两次查询order-api、比较数据等操作,影响了生产的速度。

四、优化后方案

1、优化点:

   1)查询条件切片,将查询条件切分为2个小时一段,提升SQL查询速度

   2)排序方式按照数据库里现有的顺序,采用顺序排序,使得无需增加额外开销

   3)将生产者进行拆分,按照流水线模式,切分为多个生产者,进行并行数据生产。


 2、程序流程图:

 

      


3、运行结果:能正确处理所有异常订单,并且效率超高。处理速度达到了4分钟一天,700万订单花费一个半小时。

     

 4 、缺陷:由于采用多个线程池进行并行处理,效率高的同时造成了CPS占用飙升,使用率达到了100%,监控中心告警。

五、优化总结

   在以上的两个方案中,可以总结出几个程序优化的方法:

   

1、  SQL优化:

1)  做查询时,要考虑到总体的数据量。对查询条件进行切分,再进行分页查询。同时查询条件一定要走索引。

2)  排序尽量顺序排序,减少数据库的性能消耗


2、  设计模式:

1)  对性能要求较高时,可以采用多线程的方式进行程序处理。

2)  更进一步,使用生产消费模式。将业务逻辑拆分成一个个处理单元,进行多线程池的并行处理。这样可以极大的提升程序性能;但同时能带来大量的系统资源消耗,要根据机器性能谨慎使用。


3、  线程回收:

在使用多线程的时候,必须具备完善的线程回收机制。例如在无数据时回收线程,或者在一个时间段之后回收,以保证CPU不被过多的占用。



© 著作权归作者所有

罗一鸣
粉丝 14
博文 17
码字总数 18048
作品 0
杭州
程序员
私信 提问
Java多线程学习(七)

等待/通知模式中最经典的案例当属生产者/消费者模式,此模式有几种变形,但都是基于wait/notify的。 生产者/消费者模式有两种类型:操作值的和操作栈的。下面分别从这两方面来讲解生产者/消费...

kakayang2011
2016/03/07
44
0
消息队列的使用场景和使用技巧

一、消息队列的使用场景 1、应用解耦 假设商品和结算和支付是不同的系统,两个系统之间的通讯可以通过消息队列完成,不需要强制性的接口关联。值得注意的是消息队列中间件一般都支持同步和异...

漂泊者及其影子
2016/11/21
626
0
Redis 在 Web 项目中的应用与实践

Redis作为一个开源的(BSD)基于内存的高性能存储系统,已经被各大互联网公司广泛使用,并且有着诸多的应用场景。本篇文章将基于PHP来详细讲解Redis在Web项目中的主要应用与实践。 缓存 这里所...

02/21
0
0
一年走向【Java架构师】之葵花宝典

大多数时候,不是我们不努力,而是不知从何下手,我深知一份好的学习资料是多么的重要,我们通常会把大量的时间都浪费在找资源上,本人搜集学习java架构师的经典学习路线如下可供参考!!! 一...

我一路狂奔
2017/05/20
632
1
详细剖析kafka分布式消息系统

1.背景 最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveMQ的分布式实现的很奇怪,所以希望找一个适合...

禁区铁铍人
2017/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
54分钟前
97
5
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部