Phusion Passenger提供了在N个请求处理内存问题后重新启动工作进程的功能,我想知道Puma是否有类似的设置吗?我在文档或代码中找不到任何合适的东西,但是我没有使用Puma太多,因此可能会丢失一些东西。
乘客功能的文档在这里:
PassengerMaxRequests
应用程序进程将处理的最大请求数。处理完这么多请求后,应用程序进程将关闭,Phusion Passenger将重新启动它。值0表示没有最大值:应用程序进程将在达到其空闲超时时关闭。
如果您的应用程序正在泄漏内存,则此选项很有用。通过在一定数量的请求后将其关闭,可以确保操作系统释放其所有内存。
我目前在Heroku上遇到问题,大约12到14个小时后,我们达到了Rails应用程序的内存配额限制,这完全是因为GC导致内存使用量急剧增加。我还将尝试调整我们的GC设置,但过去我发现此功能在生产环境中非常有用,因此如果可用,仍希望对其进行设置。
根据elasticsearch参考文档,可以:
可以在索引时间或查询时间应用扩展。每个都有优点(?)?和缺点(?)?何时使用取决于性能与灵活性。
优点和缺点都是有意义的,对于我的特定用途,我想在查询时使用同义词。我的用例是,我希望允许系统中的管理员用户管理这些同义词,而不必在更新时重新索引所有内容。另外,我想不关闭并重新打开索引就这样做。
我认为这是可能的主要原因是此优势:
(?)?无需重新编制文档索引就可以更新同义词规则。
但是,我找不到任何描述如何在查询时间而不是索引时间应用同义词的文档。
要使用一个具体的示例,如果我执行以下操作(示例被盗,并从reference进行了稍微修改),似乎这将在索引时间应用同义词:
/* NOTE: This was all run against elasticsearch 1.5 (if that matters; documentation is identical in 2.x) */
// Create our synonyms filter and analyzer on the index
PUT my_synonyms_test
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"queen,monarch"
]
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
}
}
}
}
// Create …Run Code Online (Sandbox Code Playgroud) 我有一个 Ecto 迁移,我想修改一些列,但也迁移一些数据。例如:
import Ecto.Query
defmodule MyApp.Repo.Migrations.AddStatus do
alter table(:foo) do
add(:status, :text)
end
foos = from(f in MyApp.Foo, where: ...)
|> MyApp.Repo.all
Enum.each(foos, fn(foo) ->
# There's then some complex logic here to work
# out how to set the status based on other attributes of `foo`
end)
end
Run Code Online (Sandbox Code Playgroud)
现在,这里的问题是,通过调用MyApp.Repo.all迁移本质上使用单独的数据库连接到alter table...语句使用的数据库连接(编辑:此假设是错误的,请参阅已接受的答案)。因此,没有status列所以整个迁移爆炸!请注意,我们使用的是postgres数据库,因此 DDL 语句是事务性的。
我可以将其作为两个单独的迁移或mix设置数据的任务来执行,只为架构更改保留迁移,但为了确保数据一致性,我不希望这样做。
关于如何以MyApp.Repo这种方式使用相同的数据库连接进行查询的任何想法?
编辑:请注意,我正在处理一小组数据,在我的用例中可以接受停机时间。如果情况并非如此,请参阅下面 José 的回复以获取一些好的建议。