Tôi có một dự án Azure WebJob, mà tôi đang chạy cục bộ trên máy tính dev của tôi. Nó đang nghe một hàng đợi tin nhắn dịch vụ Azure. Không có gì diễn ra như Chủ đề, chỉ là hàng đợi thông điệp cơ bản nhất.Cách ngăn Azure webjob xử lý cùng một thư nhiều lần đồng thời
Nó đang nhận/xử lý cùng một thông báo nhiều lần, khởi chạy hai lần ngay lập tức khi nhận được tin nhắn, sau đó liên tục trong khi tin nhắn đang được xử lý.
Câu hỏi:
- Tại sao tôi nhận được cùng một thông điệp nhiều lần ngay lập tức? Có vẻ như nó đang tìm nạp lại trước khi một PeekLock được áp dụng?
- Thông báo đang được nhận lại như thế nào ngay cả khi tin nhắn vẫn đang được xử lý? Tôi có thể đặt thời lượng PeekLock hay bằng cách nào đó khóa tin nhắn để chỉ được xử lý một lần
- Làm cách nào để đảm bảo rằng mỗi thư trên hàng đợi chỉ được xử lý một lần?
- Tôi muốn có thể xử lý nhiều thư cùng một lúc, không phải cùng một thông báo nhiều lần, vì vậy, hãy đặt MaxConcurrentCalls thành 1 có vẻ không phải là câu trả lời của tôi hoặc tôi có hiểu nhầm thuộc tính đó không?
Tôi đang sử dụng một chức năng async, phun đơn giản và một JobActivator tùy chỉnh, vì vậy thay vì một khoảng trống phương pháp tĩnh, chữ ký Chức năng của tôi là:
public async Task ProcessQueueMessage([ServiceBusTrigger("AnyQueue")] MediaEncoderQueueItem message, TextWriter log) {...}
Bên trong công việc, nó được di chuyển một số tập tin xung quanh trên một dịch vụ blob, và gọi (và chờ đợi) một bộ mã hóa phương tiện từ các dịch vụ truyền thông. Vì vậy, trong khi công việc web chính nó không phải là làm rất nhiều chế biến, phải mất khá nhiều thời gian (15 phút, đối với một số tập tin).
Ứng dụng sẽ khởi chạy và khi tôi đăng thông báo lên hàng đợi, nó sẽ phản hồi. Tuy nhiên, nó nhận được tin nhắn nhiều lần ngay sau khi nhận được tin nhắn:
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.'
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.'
Thêm vào đó, trong khi nhiệm vụ đang chạy (và tôi thấy đầu ra từ các chức năng dịch vụ Media), nó sẽ nhận được một "bản sao" từ hàng đợi.
cuối cùng sau khi tác vụ đã hoàn thành, nó vẫn không liên tục xử lý cùng một thông báo.
DeliveryCount và LockDuration được chỉ định trên hàng đợi là gì? –
Tôi cần xem xét nó. Điều kỳ lạ về LockDuration là nó dường như nhặt tin nhắn hai lần gần như ngay lập tức, như thể nó không khóa nó chút nào. Tôi tự hỏi nếu nó thực sự là một vấn đề với cách tôi đã thiết lập xử lý không đồng bộ? – AndrewP
Tắt âm thanh một chút. Các nhà môi giới sẽ không bao giờ cung cấp cho cùng một thông điệp nhiều hơn một người tiêu dùng cạnh tranh nếu LockDuration đã không hết hạn. Tôi nghi ngờ điều gì đó khác đang xảy ra. Bất kỳ cơ hội nào bạn có thể chia sẻ một repro trên GitHub hoặc BitBucket? –