Гонки на Erlang
SPBHUG 14.03.2012
Антон Ланцов
anton.lantsov@gmail.com
http://vk.com/app468346
PHP
//5600 строк кода
while(true){
for(socket in getSockets()){
while(socket.hasMessage){
handle(socket.next());
}
}
}
Сервер на JAVA
Erlang
процессы
Создание заезда
handle_cast({createLobby, LobbyInfo, FirstClientPID, FirstClientInfo, User}, State) ->
removeFromAllLobbies(FirstClientInfo#clientInfo.clientID, State),
NewState = case checkLobbyPossibility(LobbyInfo, FirstClientInfo, User) of
ok ->
NextLobbyID = State#state.nextLobbyID,
Type = if State#state.cityID =:= 3 andalso LobbyInfo#lobbyInfo.league =/= 4 ->
team;
true ->
normal
end,
NewLobbyInfo = LobbyInfo#lobbyInfo{id=NextLobbyID, type = Type},
{ok, NewLobbyPID} = lobby:start(NewLobbyInfo, State#state.cityID, self()),
erlang:monitor(process, NewLobbyPID),
lobby:addClient(FirstClientPID, FirstClientInfo, NewLobbyPID, joinLobby),
NewLobbies = dict:store(State#state.nextLobbyID, {NewLobbyPID, NewLobbyInfo}, State#state.lobbies),
NewState1 = State#state{nextLobbyID=NextLobbyID+1, lobbies=NewLobbies},
NewState1;
{error, {Reason, Message}} ->
FirstClientPID ! {createLobby, error, {Reason, Message}},
State
end,
{noreply, NewState};
Обработка ошибок
Проблемы с сетью
terminate(Reason, State) ->
State#state.clientPID ! {socketClosed, Reason},
ok.
Другие проблемы клиента
terminate(Reason, State) ->
init([ConfigPath | _Args]) ->
Config = utils:readConfig(ConfigPath++"server.cfg"),
SecureConfig = utils:readConfig(?SECURE_CFG_PATH),
mneser:start(),
Log = {log, {log, start_link, [get(Config, logBasePath)]},
permanent, 2000, worker, [log]},
QueryCache = {queryCache, {queryCache, start_link, []},
permanent, 2000, worker, [queryCache]},
SystemStats = {systemStats, {systemStats, start_link, []},
permanent, 2000, worker, [systemStats]},
Vkontakte = {vkontakte, {vkontakte, start_link, [...]},
permanent, 2000, worker, [vkontakte]},
CityManager = {cityManager, {cityManager, start_link, []},
permanent, 2000, worker, [cityManager]},
CitySupervisor1 = {citySupervisor1, {citySupervisor, start_link, [1]},
permanent, 2000, supervisor, [citySupervisor]}, X3
Backuper = {backuper, {backuper, start_link, [get(Config, backupPeriod)]},
permanent, 2000 , worker, [backuper]},
ServerSocket = {serverSocket, {serverSocket, start_link, [get(Config, gamePort)]},
permanent, 2000, worker, [serverSocket]},
FlashSecurity1 = {flashSecurity1, {flashSecurity, start_link, [get(Config, flashSecurePort)]},
permanent, 2000, worker, [flashSecurity]},
Children = [Log, QueryCache, Vkontakte, CityManager, CitySupervisor1..3, Backuper, ServerSocket, FlashSecurity1..2],
{ok, {{one_for_one, 3, 10}, Children}}.
статистика
вопросы?