多线程分工模式
Thread-Per-Message 模式,为每个任务分配一个独立的线程。
这种模式经典的应用场景是网络编程里服务端的实现,服务端为每个客户端请求创建一个独立的线程,当线程处理完请求后,自动销毁,这是一种最简单的并发处理网络请求的方法。
这种模式会存在性能缺陷。线程是一个重量级的对象,创建成本很高,一方面创建线程比较耗时,另一方面线程占用的内存也比较大,所以为每个请求创建一个新的线程并不适合高并发场景。
Worker Thread模式,避免重复创建线程(线程的复用)
Worker Thread 模式能避免线程频繁创建、销毁的问题,而且能够限制线程的最大数量。在Java 是用线程池来实现 Worker Thread 模式。
生产者 - 消费者模式
生产者 - 消费者模式的核心是一个任务队列,生产者线程生产任务,并将任务添加到任务队列中,而消费者线程从任务队列中获取任务并执行。
生产者 - 消费者模式的优点:
- 支持异步处理,将不是必要的业务逻辑进行异步处理
- 解耦,非核心的业务调用失败,不影响核心业务的逻辑
- 可以消除生产者生产与消费者消费之间速度差异,在某一段业务高峰期的时间里生产者“生产”任务的速率很快,而消费者“消费”任务速率很慢,由于中间的任务队列的存在,也可以起到缓冲的作用
过饱问题解决方案
什么是过饱问题?单位时间内,生产者生产的速度大于消费者消费的速度,导致任务不断堆积到阻塞队列中,队列堆满只是时间问题。
场景一:消费者每天能处理的量比生产者生产的少。如生产者每天1万条,消费者每天只能消费5千条
解决办法:消费者加机器
场景二:消费者每天能处理的量比生产者生产的多。但在系统高峰期生产者速度太快,把队列塞爆了。
解决办法:适当的加大队列
场景三:消费者每天能处理的量比生产者生产的多。但队列没法设置特别大,系统高峰期生产者速度太快,把队列塞爆了。
解决办法:生产者限流
