共175行
2026-03-17 11:35:55
我曾专业参与过两个网络服务器的开发,这两个服务器有着相似的技术需求:
表1.1 两个实际Web服务器中使用的技术对比
| 技术要求 | 服务器A | 服务器B |
|---|---|---|
| HTTP服务器 | NGINX and Phusion Passenger | Erlang |
| 请求处理 | Ruby on Rails | Erlang |
| 长时间运行的请求 | Go | Erlang |
| 服务器级状态 | Redis | Erlang |
| 可持久化数据 | Redis and MongoDB | Erlang |
| 后台作业 | cron, Bash scripts, and Ruby | Erlang |
| 服务崩溃恢复 | Upstart | Erlang |
-module(sum_server).
-behaviour(gen_server).
%% 对外暴露的 API
-export([start/0, sum/3]).
%% gen_server 回调函数(必须实现,即使不需要)
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
%% 启动服务器进程
start() ->
gen_server:start(?MODULE, [], []).
%% 调用求和方法
sum(Server, A, B) ->
gen_server:call(Server, {sum, A, B}).
%% 初始化回调(必须实现)
init(_Args) ->
{ok, undefined}.
%% 处理同步调用(核心求和逻辑)
handle_call({sum, A, B}, _From, State) ->
{reply, A + B, State}.
%% 以下是必须实现但本示例用不到的空回调
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.defmodule SumServer do
# 使用 GenServer 行为,Elixir 自动处理回调默认实现
use GenServer
# 启动服务器进程(简化语法)
def start do
GenServer.start(__MODULE__, nil)
end
# 调用求和方法(语法糖简化调用)
def sum(server, a, b) do
GenServer.call(server, {:sum, a, b})
end
# 仅需实现核心回调,其余由 use GenServer 自动生成默认实现
@impl true
def handle_call({:sum, a, b}, _from, state) do
{:reply, a + b, state}
end
end除了代码简化,Elixir 相比 Erlang 还有这些关键提升: