【问题标题】:How to ensure that sent message with Kinesis Producer Library get delivered如何确保使用 Kinesis Producer Library 发送的消息得到传递
【发布时间】:2017-10-16 15:56:42
【问题描述】:

我将 KPL 与 AWS lambda (Java) 一起用于生成 Kinesis 流。

我添加消息的代码是这样的:

ListenableFuture<UserRecordResult> f = KP.addUserRecord(Stream, partitionKey, ByteBuffer.wrap(data.getBytes()));
Futures.addCallback(f, new FutureCallback<UserRecordResult>() {
            private Logger LG = Logger.getLogger(this.getClass());

            @Override
            public void onSuccess(UserRecordResult result) {
                LG.info("Successfully sent "+result.getSequenceNumber()+" to stream shard #"+result.getShardId());
            }

            @Override
            public void onFailure(Throwable t) {
                LG.debug("Something wrong happend while sending to stream , "+t.getMessage());
            }
        });

问题有时是在Lambda 的执行过程中,生产者没有将消息提交给 Kinesis。因此,如果我想强制执行它来推送消息,我必须调用方法 flushSync(),这会导致 Lambda 稍后出现其他错误。

另外我的 KPL 配置是:

AggregationEnabled = true
AggregationMaxCount = 4294967295
AggregationMaxSize = 51200
CollectionMaxCount = 500
CollectionMaxSize = 5242880
ConnectTimeout = 6000
FailIfThrottled = false
MaxConnections = 24
MetricsGranularity = shard
MinConnections = 1
RateLimit = 150
RecordMaxBufferedTime = 3000
RecordTtl = 30000
RequestTimeout = 60000
VerifyCertificate = true
CredentialsRefreshDelay = 100

【问题讨论】:

  • 您对 Kinesis 所做的“同步”提交如何影响您的 lambda?这对我来说听起来很奇怪。你能解释一下吗?
  • 当我这样做时,有时它会在执行过程中给我这个错误:错误 KinesisProducer:150 - 子进程 java.lang.RuntimeException 中的错误:在 com.amazonaws.services 读取期间达到 EOF。 kinesis.producer.Daemon.fatalError(Daemon.java:516) 在 com.amazonaws.services.kinesis.producer.Daemon.fatalError(Daemon.java:492) 在 com.amazonaws.services.kinesis.producer.Daemon.fatalError( Daemon.java:488) 在 com.amazonaws.services.kinesis.producer.Daemon.readSome(Daemon.java:537) 在 com.amazonaws.services.kinesis.producer.Daemon.receiveMessage(Daemon.java:245)跨度>

标签: java aws-lambda amazon-kinesis amazon-kinesis-kpl


【解决方案1】:

这是 kinesis KPL 的一个已知问题,它的行为与 AWS 中的其他服务不同。它已作为一个问题解决,但尚未解决。 此外,运行 flush 或 flushSync 方法并不能确保正确写入整个事务,因为 lambda 可能会超时(外部关闭)。

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2016-09-07
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多