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服务。
为什么默认启用压缩?