1.問題:項目瓶頸,通過rabbitMq來異步上傳圖片,由于并發上傳的圖片過多導致阿里OSS異常,
? ?解決方法:通過prefetchCount限制圖片上傳OSS的并發數量
2.定義消費者
@Component
@AllArgsConstructor
@Slf4j
public class ReceiveFaceImageEvent {private final UPloadService uploadService;/*** 采用 prefetchCount限制消費并發數*/@RabbitHandler@RabbitListener(queues = "faceImageQueue",//指定了應該使用哪個RabbitListenerContainerFactory來創建消息監聽容器containerFactory = "limitRabbitListenerContainerFactory",//這設置了并發消費者的數量范圍。在這個例子中,它設置了兩個并發消費者,這意味著同時有兩個線程可以處理來自該隊列的消息。//(concurrency 控制特定監聽器的并發消費者數量,而 setMaxConcurrentConsumers 控制通過工廠創建的所有監聽器的并發消費者數量的上限。兩者并不直接沖突,但 concurrency 會覆蓋工廠級別的設置(對于設置了concurrency的監聽器而言))concurrency = "2-2")public void handler(MqMessage mqMessage){FaceImageInput input= (FaceImageInput) mqMessage.getObj();uploadService.uploadImage(input.getFaceImageUrl());}
}
3.創建RabbitMQ消息監聽容器的工廠類。
@Configuration
public class RabbitAutoConfiguration {@Bean("limitRabbitListenerContainerFactory")public SimpleRabbitListenerContainerFactory limitRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//設置最大消費者 (設置此監聽容器工廠創建的監聽容器的最大并發消費者數量為5。這意味著在任何時候,都將有最多5個消費者線程并發地從RabbitMQ隊列中拉取消息。)factory.setMaxConcurrentConsumers(5);//設置預取,計數為30。(預取是RabbitMQ消費者從隊列中預先拉取但尚未處理的消息數量。當消費者處理消息的速度跟不上從隊列中拉取消息的速度時,這個設置可以幫助減少消費者的空閑時間。但是,如果設置得太高,可能會導致消費者處理不過來,從而增加消息的延遲。)factory.setPrefetchCount(30);//設置了消息確認模式為自動確認(當消息被消費者處理完成后,RabbitMQ將自動認為該消息已被成功處理,并從隊列中刪除)factory.setAcknowledgeMode(AcknowledgeMode.AUTO);return factory;}}