記錄一次日常開發中基於阻塞佇列的生產者和消費者模型
- 在產品的開發中遇到一個業務場景,產品客戶端需要記錄對客戶端的每條請求並上報到產品後臺中心端。原來的程式碼邏輯是獲取到請求流量直接傳送給中心端,簡單粗暴。經過測試,如果客戶端在檢測高併發系統時效率大大降低,鑑於此處是一個典型的生產者消費者模式,考慮用阻塞佇列做快取,下面貼程式碼:
**
流量快取阻塞佇列(選用LinkedBlockingQueque,設定大小為1000)
private static BlockingQueue<Mirror> cacheQueue = new LinkedBlockingQueue<Mirror> (1000);
消費者:
/**
* 客戶端初始化時呼叫
*/
public static void initMirrorSender() throws Exception {
//此處也可使用執行緒池,因為是常駐執行緒,所以區別不大
Thread senderThread = new Thread(new Runnable() {
List<Mirror> mirrorList;
Mirror mirror;
@Override
public void run() {
while (true) {
//每次取流量時如果當前佇列裡無元素,則block
mirror = cacheQueue.take();
mirrorList.add(mirror);
//保證每次傳送最大不超過200條
while(mirrorList.size<200 && (mirror = cacheQueue.poll()) != null ){
mirrorList.add(mirror);
}
try{
//向中心端傳送流量
HttpUtil.sendPost(url, mirrorList);
}catch(Throwable t){
LOGGER.error(t);
}
try {
//預設200毫秒從佇列裡取一次
Thread.sleep(200);
} catch (InterruptedException e) {
LOGGER.error(e);
}
continue;
}
}
});
thread.start();
}
生產者
public static void mirrorGenerator(Mirror mirror){
//此處省略對mirror的引數校驗
。。。。
if(cacheQueue.offer(mirror)){
Logger.info("Cache successfully!")
}else{
Logger.info("Cache Failed!");
}
}
通過優化,大大 減少了http請求互動,挺高了效能
相關文章
- 阻塞佇列和生產者-消費者模式佇列模式
- 什麼是阻塞佇列?如何使用阻塞佇列來實現生產者-消費者模型?佇列模型
- [Java併發程式設計實戰] 阻塞佇列 BlockingQueue(含程式碼,生產者-消費者模型)Java程式設計佇列BloC模型
- Qt基於QSemaphore的生產者消費者模型QT模型
- 用阻塞佇列實現一個生產者消費者模型?synchronized和lock有什麼區別?佇列模型synchronized
- 2.Python程式間的通訊之佇列(Queue)和生產者消費者模型Python佇列模型
- 生產者消費者模型模型
- PHP操作Beanstalkd佇列(2)生產者與消費者PHPBean佇列
- 使用Python佇列和多執行緒實現生產者消費者Python佇列執行緒
- 使用Disruptor實現生產者和消費者模型模型
- 鎖,threading local,以及生產者和消費者模型thread模型
- 新手練習-消費者生產者模型模型
- rabbitMQ實戰生產者-交換機-佇列-消費者細談MQ佇列
- 一個Java基於阻塞的定時消費記憶體佇列Java記憶體佇列
- ActiveMQ 生產者和消費者demoMQ
- 生產者消費者
- 生產者消費者模式,以及基於BlockingQueue的快速實現模式BloC
- 十五、.net core(.NET 6)搭建RabbitMQ訊息佇列生產者和消費者的簡單方法MQ佇列
- PHP開發者該知道的多程式消費佇列PHP佇列
- Java實現生產者和消費者Java
- python多執行緒+生產者和消費者模型+queue使用Python執行緒模型
- 生產者消費者模式模式
- 實戰Spring4+ActiveMQ整合實現訊息佇列(生產者+消費者)SpringMQ佇列
- python 生產者消費者模式Python模式
- 使用slice和條件變數實現一個簡單的多生產者多消費者佇列變數佇列
- 生產消費者模式模式
- Python並行程式設計(六):多執行緒同步之queue(佇列)實現生產者-消費者模型Python並行行程程式設計執行緒佇列模型
- C++ condition_variable 實現生產者消費者模型C++模型
- edenhill/kcat:通用命令列非 JVM Apache Kafka 生產者和消費者命令列JVMApacheKafka
- 使用BlockQueue實現生產者和消費者模式BloC模式
- python中多程式消費者生產者問題Python
- 併發設計模式---生產者/消費者模式設計模式
- 九、生產者與消費者模式模式
- 生產者與消費者問題
- 插曲:Kafka的生產者案例和消費者原理解析Kafka
- 多生產者-消費者中假死現象的處理
- 食堂中的生產-消費模型模型
- python 多執行緒實現生產者與消費者模型Python執行緒模型