node.js - Elasticsearch 429 Too Many Requests _bulk 与同步请求
问题描述
我正在使用 AWS Elasticsearch 服务。在开发环境中有 t3.small 实例。我有大约 15 000 条记录要作为批量索引。我所做的是将这个数量分成每个 250 个项目(或低于 10 MiB)的块。并逐个运行带有refresh="wait_for"选项的_bulk 请求,并等待请求完成后再发送下一个请求。在某个时候,大约在 25 次迭代中,请求立即失败并显示消息
429 Too Many Requests /_bulk
以防万一,如果块大小为 500,这将在 25/2 请求时失败(大约 12)
它没有更多的说明。仅此而已,如果没有其他任何东西可以与我并行发送批量请求,我无法理解为什么会发生这种情况。我检查了数据大小小于 10MB。
我已经拥有的
- 我始终如一地发送每个请求,等待上一个请求
- 批量请求大小小于 10MiB
- 每个批量请求中包含不超过 250 条记录(+ 250 表示这是索引)
- 我正在使用 refresh="wait_for"
- 甚至在发送新请求之前有 2 秒的延迟(我强烈希望将其删除)
- 添加新实例或增加存储空间根本没有帮助
出现该错误的原因可能是什么?如果我始终如一地发送所有内容,如何保证我的请求不会失败?我可以通过任何其他选项来确保批量请求完全完成吗?
解决方案
作为写拒绝的 429 错误消息表示批量队列错误。es_rejected_execution_exception[bulk] 表示您的队列已满并且任何新请求都被拒绝。当对 Elasticsearch 集群的请求数超过批量队列大小(threadpool.bulk.queue_size)时,就会出现此批量队列错误。每个节点上的批量队列可以容纳 50 到 200 个请求,具体取决于您使用的 Elasticsearch 版本。
您可以查阅此链接https://aws.amazon.com/premiumsupport/knowledge-center/resolve-429-error-es/并查看写拒绝最佳实践
推荐阅读
- sql - PostgreSQL - 使用 JOIN 更新 - 内部还是外部?
- java - Java Spring - 如何通过@WithUserDetails 使用来自application.properties 的值
- .net - 如何通过.Net上的接口实现传递属性
- ajax - Django开发跨域读阻塞(CORB)(不是CORS)
- html - 当我有很多图表时,在页面中加载一个图表后隐藏微调器
- nexus - Nexus3 处于活动状态(已退出)且不可访问
- swift - 如何将子视图添加到所有 UITable 单元格
- azure - Azure Function GET 请求得到 401,但 POST 有效
- php - 访问 php 变量
- html - 为什么底部 h3 标题会缩进?