2016-02-13 12 views
0

如何確保在創建具有相同標記的新SNS應用程序端點之前安全刪除了我的SNS應用程序端點?我有一個ProgressListner的刪除方法,但是當我檢查刪除的端點時,它仍然存在很短的時間。如何保證AWS SNS deleteEndpoint已被刪除

我預料在收到CLIENT_REQUEST_SUCCESS_EVENT時,刪除已完成100%。我使用AmazonSNSClient不AmazonSNSAsyncClient

public void deleteEndpoint(final String applicationArn, final String token) { 
    LOG.fine(String.format("Deleting endpoint by token for appArn=%s, token=%s", applicationArn, token)); 
    Endpoint endpoint = findEndpointByToken(applicationArn, token); 
    if (endpoint != null) { 

     DeleteEndpointRequest der = new DeleteEndpointRequest().withEndpointArn(endpoint.getEndpointArn()); 

     der.withGeneralProgressListener(new ProgressListener() { 
     public void progressChanged(ProgressEvent event) { 
      ProgressEventType eventType = event.getEventType(); 
      System.out.println(eventType); 
      if (eventType.equals(ProgressEventType.CLIENT_REQUEST_SUCCESS_EVENT)) { 
      Endpoint exists = findEndpointByToken(applicationArn, token); 
      //This I expect this to be null but its only null after a few seconds 

      } 
     } 
     }); 

     LOG.info(String.format("Deleted endpoint by token for appArn=%s, token=%s", applicationArn, token)); 
    } 
    } 

事件的輸出是

CLIENT_REQUEST_STARTED_EVENT 
    HTTP_REQUEST_STARTED_EVENT 
    HTTP_REQUEST_COMPLETED_EVENT 
    RESPONSE_CONTENT_LENGTH_EVENT 
    HTTP_RESPONSE_STARTED_EVENT 
    RESPONSE_BYTE_TRANSFER_EVENT 
    HTTP_RESPONSE_COMPLETED_EVENT 
    CLIENT_REQUEST_SUCCESS_EVENT 
+1

我看到你創建一個'DeleteEndpointRequest'對象,但是我沒有看到你將它傳遞給任何地方的'AmazonSNSClient.deleteEndpoint()'。我甚至沒有看到你在問題的代碼中的任何地方使用AmazonSNSClient。 –

回答

1

SNS是一個大的,可擴展的分佈式系統,並與一些業務,在這樣的系統中,有一點點一種不確定現象,即刪除請求通過系統傳播時,同時刪除的內容仍然存在並且不再存在。

雖然下面的語句並不能直接證明上述說法適用於你正在做的動作,這是一個強烈的信號:

這個動作是冪等。

http://docs.aws.amazon.com/sns/latest/api/API_DeleteEndpoint.html

冪等操作可以在沒有改變的結果(如添加0至的整數)被重複。從本質上講,如果行動如記錄的那樣是冪等的,那麼成功的迴應並不意味着「它已被刪除」,而是意味着「你被授權刪除它,如果它尚未被刪除,它將被刪除。」

因此,您的解決方法是在指數回退計時器中循環輪詢,直到您獲得預期的空結果,如果在繼續之前需要知道它已經消失了。這實際上並不能保證它會完全進入系統範圍,所以儘管可能性較小,但仍有可能發生衝突。

對於分佈式系統來說,「保證」是一個困難的提議,除非它們對於所有操作都有直接的一致性,但通常情況並非如此,因爲即時一致性通常與可伸縮性不一致。

+0

謝謝,我知道在AWS的分佈式特性中,很難確定它何時從所有節點/主機等中刪除,但我認爲ProgressListener將允許更準確地知道項目何時成功刪除。我最終必須做一個定時重複檢查,看它是否在創建一個新的之前被刪除,並且可以長達10秒。 –