elixir - Phoenix 这么慢?请帮助提高其性能

标签 elixir phoenix-framework

我学习 elixir 只是因为网上很多文章都 promise 它的响应时间小于一毫秒。我昨天构建了我的第一个应用程序,但我找不到它的性能比 Rails 更快。发生了什么事?

让我解释一下我的应用程序。它实现了 ecto-secure-password 包提供的基本认证机制:

defmodule HelloPhoenix.User do
  use HelloPhoenix.Web, :model
  use SecurePassword

  schema "users" do
    field :first_name, :string
    field :last_name, :string
    field :username, :string

    has_secure_password
  end
end

这是我的 Controller :

defmodule HelloPhoenix.SessionController do
  use HelloPhoenix.Web, :controller

  def create(conn, %{ "session" => %{ "username" => username, "password" => password }}) do
    if user = HelloPhoenix.User.authenticate(HelloPhoenix.Repo.get_by(HelloPhoenix.User, username: username), password) do
      conn
      |> put_session(:user_id, user.id)
      |> json(UserSerializer.run(user))
    else
      conn
      |> put_status(422)
      |> json(%{})
    end
  end
end

所以,我正在使用这些命令:

MIX_ENV=prod mix compile
MIX_ENV=prod mix phoenix.server

失败和成功身份验证的响应时间约为 130 毫秒,而此处的 Rails 响应时间约为 150 毫秒。我做错了什么?

最佳答案

它之所以“慢”是因为密码哈希函数(在本例中为 bcrypt)是故意慢的,以避免暴力攻击。我认为您不必为此担心,因为您只需要在用户登录时进行哈希处理,而不是在每次请求时都进行哈希处理。另一方面,攻击者每次尝试输入密码时都需要付出代价。

但是,建议在运行测试代码时减少轮次,因为在每次请求时都创建一个用户会减慢您的测试速度。缓慢的测试使开发人员不会经常运行它们,这并不好。

ecto-secure-password 使用 comeonin,因此,如果你想让它在测试环境中更快(不要在生产,因为它根本不安全),您可以将其配置为仅使用几轮。

将此附加到您的 config/test.exs:

config :comeonin, :bcrypt_log_rounds, 4
config :comeonin, :pbkdf2_rounds, 1

瞧,生产是安全的,同时您的测试仍然很快(我的测试从 15 秒缩短到 < 1 秒)。

关于elixir - Phoenix 这么慢?请帮助提高其性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36804638/

相关文章:

ruby-on-rails - Phoenix 中 Rails 的 before_filter 等价物

logging - Elixir:如何将记录器连接到特定的记录器后端

ejabberd - Phoenix/Elixir/Ejabberd - 响应已发送错误

testing - 用于测试比较的 Elixir 最佳数据结构

elixir - 哪些情况需要在 Elixir 中 throw/catch ?

phoenix-framework - Ecto where like 查询就像 where ==

tags - 如何从 .eex 文件调用函数

erlang - 如何在 Elixir 或 Erlang 中推断当前时区?

elixir - 如何让 Elixir/Phoenix LiveComponent 向自身而不是其父级发送消息?

javascript - 在模块中导入 jQuery 插件