Моя цель — использовать API AWS Kinesis для создания потока Kinesis с определенным именем, если он еще не существует, а затем записать в него, был ли он там изначально или нет.
Это то, что я придумал до сих пор. Попытка создать поток. Если он завершается ошибкой с кодом 400 и возвращает идентификатор запроса, возможно, поток уже существует. Затем напишите в поток, чтобы убедиться, что он есть. В Го:
k := kinesis.New(session.New())
_, err := k.CreateStream(&kinesis.CreateStreamInput{
ShardCount: aws.Int64(2),
StreamName: aws.String("stream"),
})
if err != nil {
if reqerr, ok := err.(awserr.RequestFailure); ok {
if reqerr.RequestID() == "" {
log.Fatal("request was not delivered as it has no ID",
reqerr.Code(),
reqerr.Message(),
)
}
if reqerr.StatusCode() != 400 {
log.Fatal("unexpected status code", reqerr.StatusCode())
}
} else {
log.Fatal(err)
}
}
// Code 400 + requestID does not necessarily mean that the stream exists
// So write to the stream to confirm it exists
_, err = k.PutRecord(&kinesis.PutRecordInput{
Data: []byte("Hello Kinesis"),
PartitionKey: aws.String("partitionkey"),
StreamName: aws.String("stream"),
})
if err != nil {
log.Fatal(err)
}
Приведенный выше подход кажется запутанным, и, что более важно, я не думаю, что он эффективно соответствует точной ошибке, которую я ожидаю. Выполнение сравнения строк в сообщении об ошибке тоже кажется плохим выбором, потому что это может легко измениться.
Мне интересно, есть ли более надежный и простой способ добиться этого? Перечисление всех доступных потоков для поиска является проблемой, поскольку это линейный поиск, включающий несколько запросов с новыми значениями ExclusiveStartStreamName
.