tlw-ray / spmc-demo

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

单生产者多消费者DEMO程序

概述

  1. 一个生产者,多个消费者,消费者用多进程处理任务, 生产者连续地随机生成任务放入消息队列( 如打印字符串任务、整数加法任务)。程序能充分利用CPU计算的资源,每个任务只在一个CPU核心上运行。
  2. 生产者需要记录已经完成的任务的数量,如果当前已完成的任务数量超过1000,那么停止生产。
  3. 生产者和消费者之间使用消息队列通信,消息队列是进程安全的。
  4. 如果消息队列为空,消费者进程能阻塞等待;
  5. 使用多态来支持不同种类的任务需求。
  6. 一个完整的程序,包括指明所使用的库(#include/ import等),和相应的程序入口main 函数。
  7. 代码不需要编译运行,尽量保持语法正确。可以上网搜索资料,但不能连续copy超过1行的代码。

分析

  1. 一生产者多消费者:
    • 不需要考虑消息顺序问题
    • 多消费者是对等的, 可以认为是随机消费任务的
  2. 消费者用多进程处理, 消息队列是进程安全的:
    • 进程间通讯,应采用消息中间件, 此处计划选用RabbitMQ
    • 程序需要至少有3个进程, 生产者进程、消费者进程、消息队列进程
  3. 生产者连续地随机生成任务放入消息队列( 如打印字符串任务、整数加法任务); 使用多态来支持不同种类的任务需求:
    • 抽象出Task包,来描述任务
    • Task包应该是被生产者、消费者项目共享的公共包
    • Task包至少应包含三个类: Task接口, 打印字符串Task, 整数加法Task
    • Task是可以持久化和被反持久化的, 计划采用Fastjson库实现持久化和反持久化
    • Task是可以被代码执行的, 考虑Callable接口
  4. 生产者需要记录已经完成任务的数量, 如果当前已经完成的任务数量超过1000,那么停止生产:
    • 由于是单消费者, 循环1000次即可
  5. 一个完整的程序,包括指明所使用的库(#include/ import等),和相应的程序入口main 函数:
    • 一个完整的程序, 包含生产者、消费者子项目、中间件启动脚本, 考虑采用gradle多项目管理
    • 项目提供单脚本启动中间件和一个生产者进程和三个消费者进程,共计4个进程
    • 简单原则项目仅依赖rabbitmq客户端库
  6. 代码不需要编译运行,尽量保持语法正确。可以上网搜索资料,但不能连续copy超过1行的代码
    • 代码不需要编译运行, 尽量保持语法正确: 还是尽量可以运行的好, 这样语法也会基本正确, 时间不足尽量写简单

开发

  • 项目名称: spmc-demo (单生产者多消费者示例程序)
  • 版本: 1.0.0
  • 开发环境:
    • IDE: idea2019
    • 构建: gradle6 docker
    • 语言: java8
    • 类库: junit, amqp-client, fastJson
    • 中间件: RabbitMQ3.7

制品与执行

  • 运行环境: JRE8+
  • 执行脚本
cd $PROJECT_HOME/deploy
# 启动带有管理界面的RabbitMQ
docker run \
-d \
-p 4369:4369 \
-p 5671:5671 \
-p 15671:15671 \
-p 5672:5672 \
-p 15672:15672 \
-p 25672:25672 \
-p 61613:61613 \
--name RabbitMQ \
rabbitmq:3.7.16-management

# 启动三个消费者
sh consumer.sh
sh consumer.sh
sh consumer.sh

# 启动一个生产者
sh producer.sh

bash -c “ sh ./run.sh;exec bash

容器化

  • 建立Dockerfile
  • 打包并推送到云端仓库
  • 集群执行docker-compose up弹性扩容消费者到三个

待完成

  • 动态生成queue
  • 容器化
  • 集群化

About


Languages

Language:Java 98.5%Language:Shell 1.5%