如何保证已删除AWS SNS deleteEndpoint

时间:2016-02-13 12:54:53

标签: amazon-web-services amazon-sns

在创建具有相同令牌的新SNS应用程序端点之前,如何确保安全删除我的SNS应用程序端点?我有一个带有ProgressListner的删除方法,但是当我检查删除的端点时,它仍然存在很短的时间。

我希望在收到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 个答案:

答案 0 :(得分:1)

SNS是一个庞大的,可扩展的分布式系统,并且在某些操作中,在这样的系统中,存在一些不确定现象,其中被删除的内容仍然存在且不再存在,同时,因为删除请求是通过系统传播。

虽然以下声明并未直接证明上述声明适用于您正在采取的行动,但它是一个强有力的指标:

  

此行为是幂等的。

     

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

可以重复幂等操作而不改变结果(例如将0添加到整数)。从本质上讲,如果操作在记录中是幂等的,那么成功响应并不意味着“它已被删除”,这意味着“您有权删除它,如果它还没有被删除,它将被删除。”

因此,您的解决方法是使用指数退避计时器循环轮询,直到获得预期的空结果,如果您需要知道它在继续之前已经消失了。这实际上并不能保证它在系统范围内完全消失,所以你可能仍然会发生冲突,尽管可能性较小。

“保证”对于分布式系统来说是一个困难的命题,除非它们对所有操作都具有直接一致性,这通常不是这种情况,因为直接一致性通常与可伸缩性不一致。