凤凰这么慢?请帮助改善其性能

asi*_*niy 0 elixir phoenix-framework

我之所以学习灵丹妙药只是因为互联网上的很多文章都很有希望它的响应时间不到一毫秒.我昨天构建了我的第一个应用程序,我发现它的性能比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
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

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
Run Code Online (Sandbox Code Playgroud)

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

MIX_ENV=prod mix compile
MIX_ENV=prod mix phoenix.server
Run Code Online (Sandbox Code Playgroud)

失败和成功认证的响应时间约为~130ms,而此处的rails响应时间约为150ms.我做错了什么?

Thi*_*ira 5

它"慢",因为密码散列函数(在这种情况下为bcrypt)故意缓慢,以避免暴力攻击.我不认为你应该担心它,因为你只需要在用户登录时散列,而不是每次请求.另一方面,攻击者每次尝试密码时都需要付出代价.

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

ecto-secure-password使用comeonin,因此,如果你想让它在测试环境中更快(生产使用,因为它是不安全的话),你可以将其配置为只使用几个回合.

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

config :comeonin, :bcrypt_log_rounds, 4
config :comeonin, :pbkdf2_rounds, 1
Run Code Online (Sandbox Code Playgroud)

而且,当您的测试仍然很快时,生产是安全的(我的测试从15秒变为<1秒).