Trong Amazon Simple Queue Service (SQS), “message visibility timeout” (thời gian hiển thị thông điệp) là một cài đặt quan trọng để đảm bảo rằng các thông điệp được xử lý đúng cách bởi ứng dụng mà nhận được chúng. Khi một ứng dụng nhận được một thông điệp từ hàng đợi SQS thông qua chức năng Poll for messages, thông điệp đó sẽ trở thành “không hiển thị” với các ứng dụng khác trong cùng hàng đợi.
Theo mặc định, thời gian hiển thị thông điệp là 30 giây. Điều này có nghĩa là, khi một thông điệp được lấy ra bởi ứng dụng, nó sẽ trở thành “không hiển thị” với các ứng dụng khác trong 30 giây, trong khi ứng dụng đang xử lý thông điệp đó. Nếu trong vòng 30 giây mà ứng dụng không xử lý được thông điệp, thì thông điệp sẽ trở lại “hiển thị” trong hàng đợi và có thể được lấy ra bởi bất kỳ ứng dụng nào khác.
Tuy nhiên, nếu ứng dụng đã xử lý thông điệp thành công trong 30 giây, thì nó có thể gửi một yêu cầu “Delete message” đến SQS để xóa thông điệp đó khỏi hàng đợi. Nếu không, sau khi thời gian hiển thị thông điệp đã kết thúc, thông điệp sẽ trở lại “hiển thị” trong hàng đợi và sẵn sàng cho các ứng dụng khác để lấy.
Vì vậy, thời gian hiển thị thông điệp là một yếu tố quan trọng trong việc đảm bảo rằng thông điệp được xử lý đúng cách bởi ứng dụng mà nhận được chúng, đồng thời đảm bảo tính toàn vẹn và tin cậy của hàng đợi SQS.
Đây là những trạng thái khác nhau của một tin nhắn trong hàng đợi SQS khi một yêu cầu nhận tin nhắn (ReceiveMessageRequest) được thực hiện:
- Visibility timeout: Khi một consumer lấy tin nhắn từ hàng đợi SQS, tin nhắn đó sẽ trở thành “không nhìn thấy” (invisible) với các consumer khác. Trong thời gian này, nếu consumer đó không hoàn thành xử lý tin nhắn trong khoảng thời gian được chỉ định (visibility timeout), thì tin nhắn đó sẽ được trả lại vào hàng đợi.
- Not returned: Trong trường hợp consumer không hoàn thành xử lý tin nhắn trong khoảng thời gian được chỉ định (visibility timeout), thì tin nhắn đó vẫn không được trả lại trong yêu cầu nhận tin nhắn (ReceiveMessageRequest).
- Message returned: Nếu một consumer xử lý tin nhắn thành công, tin nhắn đó sẽ được xóa khỏi hàng đợi SQS.
- Message returned (again): Tuy nhiên, nếu consumer xử lý tin nhắn thành công nhưng không gửi thông báo xóa tin nhắn cho hàng đợi SQS, thì tin nhắn sẽ trở lại trong hàng đợi sau khi đã vượt qua khoảng thời gian của visibility timeout.
Việc quản lý visibility timeout đúng là rất quan trọng để tránh một tin nhắn được xử lý nhiều lần hoặc bị mất đi nếu không xử lý được.
Nếu một tin nhắn không được xử lý trong khoảng thời gian của visibility timeout thì tin nhắn đó sẽ được xử lý hai lần. Điều này có thể xảy ra nếu consumer không hoàn thành xử lý tin nhắn trong thời gian của visibility timeout.
Consumer có thể gọi API ChangeMessageVisibility để yêu cầu thêm thời gian để xử lý tin nhắn. Tuy nhiên, nếu visibility timeout được đặt quá cao (ví dụ như một vài giờ), và consumer bị crash, thì quá trình xử lý lại sẽ tốn nhiều thời gian.
Ngược lại, nếu visibility timeout được đặt quá thấp (ví dụ như một vài giây), chúng ta có thể nhận được các bản sao (duplicates) của cùng một tin nhắn nếu consumer không hoàn thành xử lý trong khoảng thời gian của visibility timeout.
Do đó, việc thiết lập đúng visibility timeout là rất quan trọng để tránh sự cố xảy ra và đảm bảo tính nhất quán của dữ liệu.
Bây giờ chúng ta hãy demo bằng cách mở ra 2 tab giống nhau, và ở tab đầu tiên chúng ta gửi tin nhắn hello world và bấm Poll for messages, bán sẽ thấy ở phần Messages đã xuất hiện 1 tin nhắn.
Bây giờ sang tab thứ 2 cũng bấm vào Poll for messages bạn sẽ ko thấy tin nhắn nào được nhận vì lý do trong vòng 30s, tin nhắn vẫn đang ở hàng đợi chờ được xử lý bởi tab 1.
Giờ qua tab đầu tiên bấm Stop polling.
Bây giờ chúng ta qua lại tab thứ 2 chúng ta thấy số tin nhắn đã gửi là 2 và đang chờ xử lý.
Và bây giờ cũng tại tab thứ 2, chúng ta xoá tin nhắn này để kết thúc quá trình hàng đợi.