在创建具有相同令牌的新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
答案 0 :(得分:1)
SNS是一个庞大的,可扩展的分布式系统,并且在某些操作中,在这样的系统中,存在一些不确定现象,其中被删除的内容仍然存在且不再存在,同时,因为删除请求是通过系统传播。
虽然以下声明并未直接证明上述声明适用于您正在采取的行动,但它是一个强有力的指标:
此行为是幂等的。
http://docs.aws.amazon.com/sns/latest/api/API_DeleteEndpoint.html
可以重复幂等操作而不改变结果(例如将0添加到整数)。从本质上讲,如果操作在记录中是幂等的,那么成功响应并不意味着“它已被删除”,这意味着“您有权删除它,如果它还没有被删除,它将被删除。”
因此,您的解决方法是使用指数退避计时器循环轮询,直到获得预期的空结果,如果您需要知道它在继续之前已经消失了。这实际上并不能保证它在系统范围内完全消失,所以你可能仍然会发生冲突,尽管可能性较小。
“保证”对于分布式系统来说是一个困难的命题,除非它们对所有操作都具有直接一致性,这通常不是这种情况,因为直接一致性通常与可伸缩性不一致。