做一个rabbitMq的生产者消费者任务,生产者负责从数据库查询数据,放入mq,消费者从mq取数据,对数据进行解析,提取想要的字段。由于生产者放数据的速度超级快,而消费速度很慢,很容易造成队列中数据堆积。
首先想到的是多个消费者进行消费,采用mq的交换机的direct模式,随机生成abcd四个routing_key放入交换机。在消费端,声明四个队列,分别绑定abcd四个routing_key,这样就会由四个队列对数据进行并行处理,堆积少了一些,但还是有不少堆积。生产的速度远远大于消费速度,单纯的靠增加消费者数量好像不行,于是考虑生产的速度可以慢些。
每放一个睡眠x毫秒,至于是几毫秒,要看消费者的消费速度,大致就是看消费者消费一个需要多少秒。
我的消费速度大致是一秒550个,那么消费一个大致是1000ms/550=1.8ms,需要精确到纳秒级别。查源码发现 sleep(long millis, int nanos)是个假的,压根儿没有做到纳秒级别,源码如下:
public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
sleep(millis);
}