2016-08-07 39 views
0

Ich arbeite an einem Projekt, bei dem mehrere Mitarbeiter auf dieselbe Warteschlange zugreifen müssen, um Informationen über eine Datei zu erhalten, die sie bearbeiten werden. Die Größe der Dateien reicht von Megabyte bis Hunderten von Gigabyte. Aus diesem Grund scheint ein Zeitlimit für die Sichtbarkeit keinen Sinn zu ergeben, da ich nicht sicher sein kann, wie lange es dauern wird. Ich habe zwar ein paar Wege, aber wenn es einen besseren Weg gibt, lass es mich wissen.Wie kann verhindert werden, dass andere Mitarbeiter auf eine Nachricht zugreifen, die gerade bearbeitet wird?

  1. Die Nachricht von der ursprünglichen Warteschlange gelöscht und in einen ‚warten‘ Warteschlange gestellt. Wenn das Programm die Verarbeitung der Datei beendet hat, löscht es es , andernfalls wird die Nachricht aus der Warteschlange gelöscht und zurück in die ursprüngliche Warteschlange.

  2. Die Nachrichten-ID wird mit einer Datenbank überprüft. Wenn die Nachrichten-ID gefunden wird, wird sie ignoriert. Andernfalls beginnt das Programm mit der Verarbeitung der Nachricht und fügt die Nachrichten-ID in die Datenbank ein.

Vielen Dank im Voraus!

Antwort

1

Verwenden Sie das standardmäßig bereitgestellte SQS-Zeitlimit, aber nutzen Sie ChangeMessageVisibility.

Sie können das Timeout auf verschiedene Arten angeben:

  • Wenn die Warteschlange erstellt wird (Standard-Timeout)
  • Wenn die Meldung
  • Indem der Arbeiter Rückruf SQS abgerufen und erweitern das Timeout

Wenn Sie besorgt sind, dass Sie die entsprechende Verarbeitungszeit nicht kennen, verwenden Sie ein Standardwert das ist gut für die meisten Situationen, aber machen Sie es nicht so groß, dass die Dinge unnötig verzögert werden.

Dann ändern Sie Ihre Mitarbeiter zu einen ChangeMessageVisiblity Aufruf an SQS regelmäßig das Timeout zu verlängern. Wenn ein Worker stirbt, wird die Nachricht nicht mehr erweitert und erscheint erneut in der Warteschlange, um von einem anderen Worker verarbeitet zu werden.

Siehe: MessageVisibility documentation