【问题标题】:AWS RDS to AWS ESAWS RDS 到 AWS ES
【发布时间】:2018-03-09 14:14:19
【问题描述】:

要求:在插入/更新特定表时创建数据流并将其推送到弹性搜索。

Thought AWS RDS(MariaDb) ----- 插入/更新到用户表 ---> AWS Kinesis 流 -- 使用 AWS Lambda--> AWS ES

问题如何在插入/更新到特定表时创建运动流?我可以通过 AWS Lambda 完成吗?

【问题讨论】:

  • 您在RDS中使用的数据库是什么?
  • @Ashan 数据库:mariadb

标签: java elasticsearch aws-lambda amazon-kinesis amazon-kinesis-firehose


【解决方案1】:

如果您使用的是 Amazon Aurora,则可以这样做。

Amazon Aurora 的最新更新之一是支持从存储过程调用 Lambda 函数。

因此,为了实现您的要求,您可以创建一个 SQL 触发器,该触发器调用一个 SQL 存储过程,然后调用一个 Lambda 函数,将该数据发送到 Elastic Search。

参考:Invoking a Lambda Function from an Amazon Aurora DB Cluster

关于交易的注意事项

正如@Ahmad Nabilcomments below 中指出的,触发器可以在事务提交之前执行。所以调用 Lambda 的 SQL 触发器可能不是你想要的。


如果您不使用 Aurora,而是使用 MySQL 或 MariaDB,如果此功能对您的应用程序非常重要,我建议您切换。

如果您使用的是 Aurora、MySQL 或 MariaDB 以外的数据库,则必须重新考虑您的应用程序以将数据并行写入 RDS 和 ElasticSearch。我还推荐以下架构模式:

【讨论】:

  • 如果你用过或者对SQL很了解,建议补充一点。例如,我不知道mysql.lambda_async 是什么或在哪里,或者我应该如何处理它。使用CALL mysql.lambda_async ( ... ) 向db 发出请求以激活或在每次写入时?
  • @Solo 什么、在哪里以及如何使用它都记录在提供的链接中。 mysql.lambda_async 过程是一个异步调用 Lambda 函数的内置存储过程。”
  • 请注意,使用极光触发器调用 lambda 在处理事务时会导致严重问题,因为触发器可以在事务提交之前执行
  • @NoelLlevares 我自己实际测试了这个,例如,如果你在posts 表上创建了“AFTER INSERT”触发器,然后你做了一个事务,该事务插入到多个表中,包括posts 表,触发器将是即使事务回滚,在该表上插入后立即执行。通常这不会导致任何问题,因为如果事务失败,触发器也会回滚,但在我们的例子中,触发器正在调用 lambda 函数,其效果不会回滚。
  • @NoelLlevares 还有一个article 比我更好地解释了这个问题。
【解决方案2】:

我尝试使用 Amazon Aurora 触发器来调用 lambda 函数,但这在使用事务时导致了一些问题,因为可以在事务提交之前执行触发器

所以我最终做的是修改应用程序层以在与向数据库发送数据相同的“事务”中异步调用 lambda 函数, 该 lambda 函数将序列化的 JSON 作为输入(来自应用层),然后将该输入发送到 elasticsearch。

如果该 lambda 函数出现故障,您可以重试并使用 DLQ(死信队列)来确保数据不会丢失并真正进入 elasticsearch。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2022-10-13
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多