12. Concurrent processes with no data sharing
provide a strong measure of fault isolation.
A software error in a concurrent process
should not influence processing in the other
processes in the system.
creator of Erlang
Joe Armstrong
13. Based on its designated behavior, the actor responds
to incoming messages by send new messages,
spawn new actors and/or changing its future behavior.
Each actor has its own mailbox and isolated state.
15. Worker
def handle_cast(:receive, state) do
case :sqs.receive(state.queue) do
[] -> Logger.info("no messages")
messages -> to_kafka(messages)
end
{:noreply, state}
end
def terminate(reason, _) when reason == :normal, do: :ok
def terminate(reason, state) do
Logger.error("#{reason}: #{inspect state}")
:ok
end
19. ExUnit
test "decodes a base64 without padding chars" do
assert Token.urlsafe_decode64("YWJjZA") == "abcd"
assert Token.urlsafe_decode64("YWJjZA=") == "abcd"
assert Token.urlsafe_decode64("YWJjZA==") == "abcd"
end
➜ tracker mix test test/tracker/api/token_test.exs --trace
Tracker.API.TokenTest
* decodes a base64 without padding chars (8.1ms)
* decodes a base64 in the URLEncoding mode defined in RFC 4648 (0.01ms)
* fixes a token with a double question mark (0.01ms)
* decrypts a token (15.2ms)
* returns error with a broken token (14.8ms)
Finished in 0.1 seconds (0.09s on load, 0.03s on tests)
5 tests, 0 failures
20. Type Specifications
@spec network(integer) :: {String.t, String.t} | :not_found
def network(id) do
case :ets.lookup(:db_networks, id) do
[{^id, name, url}] -> {name, url}
_ -> :not_found
end
end
Dialyzer is a static analysis tool that identifies software
discrepancies such as type errors, unreachable code,
unnecessary tests, etc in Erlang / Elixir applications.
21. $ iex --name console@127.0.0.1 --remsh tracker@127.0.0.1
etop
Erlang Top is a tool for presenting information about Erlang
processes similar to the information presented by "top" in
UNIX.
erlang.processes()
Returns a list of process identifiers corresponding to all
the processes currently existing on the local node.
erlang.memory()
Returns a list with information about memory dynamically
allocated by the Erlang emulator.
22. Built-In Term Storage
ETS tables are implemented as BIFs in the ets
module.
The main design objectives ETS had was to
provide a way to store large amounts of data in
Erlang with constant access time and to have
such storage look as if it were implemented as
processes in order to keep their use simple and
idiomatic.