AWS Elasticsearch Service一直以来都是很守时地返回gzip,不解决

错误内容 (wù cuò

当我早上醒来时,发现Elasticsearch + Rails出现了以下错误。

MultiJson::ParseError: unexpected character at line 1, column 1 [parse.c:664]

太意外了,之前忽视 Accept-Encoding 的 AWS Elasticsearch Service 突然开始工作了,并且似乎以 gzip 格式返回数据。

补充说明:另外,使用elasticsearch-rails的faraday默认情况下是启用了 gzip 压缩。

版本

我添加了一些内容

elasticsearch (5.0.0)
elasticsearch-api (5.0.0)
elasticsearch-transport (5.0.0)
elasticsearch-dsl (0.1.4)
elasticsearch-model (0.1.9)
elasticsearch-rails (0.1.9)
elasticsearch-transport (5.0.0)
faraday (0.9.2)
faraday_middleware (0.12.2)
faraday_middleware-aws-signers-v4 (0.1.5)

最新版本相对有点陈旧。

解决方法 (jiě jué fǎ)

使用 Faraday Middleware gem 对其进行更改,以便能够接收 gzip。


...
gem 'faraday_middleware'
...



Elasticsearch::Model.client = Elasticsearch::Client.new(
  host: ENV.fetch('ELASTICSEARCH_ENDPOINT'),
  port: 80
) do |faraday|
  faraday.use FaradayMiddleware::Gzip # ここを追加
  faraday.request :aws_signers_v4,
                  credentials: Aws::Credentials.new(ENV.fetch('AWS_KEY_ID'), ENV.fetch('AWS_ACCESS_KEY')),
                  service_name: 'es',
                  region: 'ap-northeast-1'
  faraday.adapter Faraday.default_adapter
end

受害者协会

还有其他受害者的迹象。

发布日期:2017年9月26日上午10:56

仅仅是我的个人经验 –
在没有任何客户端更改的情况下,有一天ES的响应突然停止工作了。当我检查响应时,发现是压缩格式的。我使用的客户端库要求使用gzip。由于我没有对客户端代码做出任何更改,我猜测以下几点可能是正确的,但都没有得到实证:

a)客户端库一直都在请求压缩格式的响应(证据:https://github.com/elastic/elasticsearch-ruby/issues/457#issuecomment-326204925)
b)客户端库无法接收压缩格式的响应(证据:我的代码不起作用)
c)AWS ES服务过去忽略了对压缩格式响应的请求,现在支持它了(证据:我的代码以前可以工作)

我无法找出如何停止我的客户端库请求压缩格式响应(似乎需要修改faraday库),但通过修改我的代码,使其看起来像https://github.com/elastic/elasticsearch-ruby/issues/457#issuecomment-326020618,我成功使客户端库理解了压缩格式的响应。

希望这些数据对你有帮助。

但是,由于时间顺序不同,AWS是否会逐步进行更新?我打算与AWS联系以获取详细信息。

这是几乎同一时间受害者的链接。

留言

用户在没有gzip支持的情况下使用了Accept-encoding发送gzip请求,这是用户的错误吗?

正如您所说的一样。
由于使用了OSS库,对于该库的行为责任在于使用者。从本文的标题中可能听到一些声音表示”AWS很糟糕”,但更多是像”之前忽略了gzip,很抱歉,今早已经修复了”这样的说法。

如果说到Amazon Elasticsearch的gzip问题,不是每个节点都会返回gzip,只有某个节点会返回gzip。如果行为出现错误又返回错误的话…

如果响应不是gzip格式的话,就会原样通过,所以只要进行这个更改,即使行为恢复到原始状态也应该没问题。

补充记录 10/4 11:15 p.m. JST

写到这里我发现,根据 faraday_middleware 的说法,如果使用 Faraday.default_adapter == :net_http,那么 Gzip 将会自动解压缩… 这是什么?

  # This middleware is NOT necessary when these adapters are used:
  # - net_http on Ruby 1.9+
  # - net_http_persistent on Ruby 2.0+
  # - em_http

附注10/5 12:10 a.m. JST

真正的原因是这个吗?(未经证实)

可以使用faraday_middleware-aws-signers-v4中间件,从IAM角色授权访问Elasticsearch服务。

为什么默认启用压缩?

广告
将在 10 秒后关闭
bannerAds