SlideShare a Scribd company logo
1 of 86
Download to read offline
LET IT CRASH!
Poznań Elixir Metup #4
(DON'T) LET IT CRASH!
Poznań Elixir Metup #4
(DON'T) LET IT CRASH!
Fault tolerance in Elixir/OTP
Poznań Elixir Metup #4
(YOU CAN ASK
QUESTIONS)
Elixir (Erlang) features
‣ Concurrent
‣ Functional
‣ Immutable state
‣ Message passing
‣ Distributed
‣ Hot upgrades
FAULT TOLERANCE
Elixir (Erlang) features
‣ Concurrent
‣ Functional
‣ Immutable state
‣ Message passing
‣ Distributed
‣ Hot upgrades
LET IT CRASH!
Let it crash!
Let it crash!
‣ Accept the fact that things fail
‣ Focus on the happy path
‣ Make failures more predictable
Let it crash!
‣ Separate the logic and error handling
‣ When something is wrong, let the
process crash and let another one
handle it (e.g. by restarting)
https://ferd.ca/an-open-letter-to-the-erlang-beginner-or-onlooker.html
THE TOOLS
Tools
‣ Monitors
‣ Links
‣ Supervisors
‣ Heart
‣ Distribution
Monitors
pid_a
ref = Process.monitor(pid_b)
pid_b
Monitors
pid_a
ref = Process.monitor(pid_b)
{:DOWN, ref, :process,
pid_b, reason}
pid_b
Links
pid_a
Process.link(pid_b)
pid_b
Links
pid_a
pid_b
Process.link(pid_b)
Links
pid_b
Process.link(pid_b)
Process.flag(:trap_exit, true)
pid_a {:EXIT, from, reason}
Links
pid_b
Process.link(pid_b)
Process.flag(:trap_exit, true)
pid_a
Supervisors
Worker Worker
Supervisor
Supervisors
Worker Worker
Supervisor
Supervisors
Worker Worker
Supervisor
Worker
*New* process
Supervision strategies
opts = [
name: MyApp.Supervisor,
]
Supervisor.start_link(children, opts)
opts = [
name: MyApp.Supervisor,
strategy: :one_for_one
]
Supervisor.start_link(children, opts)
:one_for_one
W
S
W W
S
W W
S
W
:all_for_one
W
S
W W
S
W W
S
WW
S
W
:rest_for_one
W
S
WW W
S
WW W
S
WW W
S
WW
:simple_one_for_one
W
S
W W
S
W W
S
W
Heart
## vm.args
## Heartbeat management; auto-restarts VM if it
##dies or becomes unresponsive
## (Disabled by default use with caution!)
-heart
-env HEART_COMMAND ~/heart_command.sh
WHY RESTARTING
WORKS
Why restarting works
‣ Independent processes
‣ Clean state
‣ Bohrbugs vs. Heisenbugs
Bohrbugs
‣ Repeatable
‣ Easy to debug
‣ Easy to fix
‣ Rare in production
‣ Restarting doesn't help
Heisenbugs
‣ Unpredictable
‣ Hard to debug
‣ Hard to fix
‣ Frequent in production
‣ Restarting HELPS!
Heisenbugs
‣ Unpredictable
‣ Hard to debug
‣ Hard to fix
‣ Frequent in production
‣ Restarting HELPS!
Supervisors
Worker Worker
Supervisor
Worker
*New* process
New process
‣ Clean state
‣ Predictable
‣ High chance of fixing the bug
LIMITS
Limits
‣ :max_restarts (default: 3)
‣ :max_seconds (default: 5)
opts = [
name: MyApp.Supervisor,
strategy: :one_for_one,
max_restarts: 1, max_seconds: 1
]
Supervisor.start_link(children, opts)
Limits
‣ Process
‣ Supervisor
‣ Node
‣ Machine
Restarting
MISTAKES
‣ Poor supervision tree structure
‣ Not validating user params
‣ Not handling expected errors
‣ {:error, reason} tuples everywhere
Mistakes
‣ Trying to recreate the state
‣ Timeouts
‣ Not reading libraries source code
‣ Incorrect limits
Mistakes
Expected errors
{:ok, user} =
Auth.authenticate(email, password)
{:ok, user} =
UserService.fetch_by_id(params["id"])
Restoring the state
def init(_) do
state = restore_state()
{:ok, state}
end
def terminate(_reason, state) do
save_state(state)
end
http://mkaszubowski.pl/2017/09/02/On-Restoring-Process-State.html
Poor supervision structure
Stable, long-lived, important, protected
Short-lived, transient, can fail
Incorrect limits
DEMO!
BENEFITS
‣ Less code (= less bugs, easier to
understand, easier to change)
‣ Less logic duplication
‣ Faster bug fixes
Benefits
Less code
def update_name(user, name) do
end
def update_name(user, name) do
update(user, %{name: name})
end
def update_name(user, name) do
case update(user, %{name: name}) do
end
end
def update_name(user, name) do
case update(user, %{name: name}) do
{:ok, user}  {:ok, user}
end
end
def update_name(user, name) do
case update(user, %{name: name}) do
{:ok, user}  {:ok, user}
{:error, reason}  {:error, reason}
end
end
def update_name(user, name) do
case update(user, %{name: name}) do
{:ok, user}  {:ok, user}
{:error, reason}  {:error, reason}
end
end
def update_name(user, name) do
case update(user, %{name: name}) do
{:ok, user}  {:ok, user}
{:error, reason}  {:error, reason}
end
end
‣ Do you know how to handle reason?
‣ Is {:error, reason} even possible?
‣ Fatal or acceptable error?
‣ What is likely to happen?
‣ What is an acceptable error?
‣ What do I know how to handle?
def update_name(user, name) do
{:ok, _} = update(user, %{name: name}) do
end
def update_name(user, name) do
case update(user, %{name: name}) do
{:ok, user}  {:ok, user}
{:error, %{errors: [username: "cannot be blank"]}} 
{:error, :blank_username}
end
end
Acceptable error
def update_description(transaction, user) do
with 
%{receipt: receipt}  transaction,
false  is_nil(receipt),
{:ok, %{"id"  id}  Poison.decode(receipt),
{:ok, %{status: 200, body: body}}  Adapter.update(id, user)
{:ok, _}  update_db_record(id, body)
do
:ok
end
end
def update_description(transaction, user) do
Task.Supervisor.start_child(MyApp.TaskSupervisor, fn 
with 
%{receipt: receipt}  transaction,
false  is_nil(receipt),
{:ok, %{"id"  id}  Poison.decode(receipt),
{:ok, %{status: 200, body: body}}  Adapter.update(id, user)
{:ok, _}  update_db_record(id, body)
do
:ok
end
end)
end
def update_description(transaction, user) do
Task.Supervisor.start_child(MyApp.TaskSupervisor, fn 
with 
%{receipt: receipt}  transaction,
false  is_nil(receipt),
{:ok, %{"id"  id}  Poison.decode(receipt),
{:ok, %{status: 200, body: body}}  Adapter.update(id, user)
{:ok, _}  update_db_record(id, body)
do
:ok
end
end)
end
def update_description(transaction, user) do
Task.Supervisor.start_child(MyApp.TaskSupervisor, fn 
with 
%{receipt: receipt}  transaction,
false  is_nil(receipt),
{:ok, %{"id"  id}  Poison.decode(receipt),
{:ok, %{status: 200, body: body}}  Adapter.update(id, user)
{:ok, _}  update_db_record(id, body)
do
:ok
end
end)
end
def update_description(transaction, user) do
Task.Supervisor.start_child(MyApp.TaskSupervisor, fn 
%{"id"  transaction_id} = Poison.decode!(receipt)
{:ok, %{body: body}} = Adapter.update(transaction_id, user)
{:ok, _} = update_db_record(transaction_id, body)
end
end
Less duplicated logic
def add_contact(current_user_id, nil),
do: {:error, :invalid_contact_id}
def add_contact(current_user_id, contact_id) do
params = %{user_id: current_user_id, contact_id: contact_id}
%Contact{}
 Contact.Changeset(params)
 Repo.insert()
 case do
{:ok, contact}  {:ok, contact}
{:error, changeset}  {:error, changeset}
end
end
def add_contact(current_user_id, nil),
do: {:error, :invalid_contact_id}
def add_contact(current_user_id, contact_id) do
params = %{user_id: current_user_id, contact_id: contact_id}
%Contact{}
 Contact.Changeset(params)
 Repo.insert()
 case do
{:ok, contact}  {:ok, contact}
{:error, changeset}  {:error, changeset}
end
end
def add_contact(current_user_id, nil),
do: {:error, :invalid_contact_id}
def add_contact(current_user_id, contact_id) do
params = %{user_id: current_user_id, contact_id: contact_id}
%Contact{}
 Contact.Changeset(params)
 Repo.insert()
 case do
{:ok, contact}  {:ok, contact}
{:error, changeset}  {:error, changeset}
end
end
def add_contact(current_user_id, nil),
do: {:error, :invalid_contact_id}
def add_contact(current_user_id, contact_id) do
params = %{user_id: current_user_id, contact_id: contact_id}
%Contact{}
 Contact.Changeset(params)
 Repo.insert()
 case do
{:ok, contact}  {:ok, contact}
{:error, changeset}  {:error, changeset}
end
end
def add_contact(current_user_id, contact_id) do
params = %{user_id: current_user_id, contact_id: contact_id}
{:ok, _} =
%Contact{}
 Contact.Changeset(params)
 Repo.insert()
end
Faster bug fixes
def handle_info(:do_work, state) do
with {:ok, data}  ServiceA.fetch_data(),
{:ok, other_data}  ServiceB.fetch_data()
do
do_some_work(data, other_data)
end
Process.send_after(self(), :do_work, @one_hour)
{:noreply, state}
end
def handle_info(:do_work, state) do
{:ok, data} = ServiceA.fetch_data()
{:ok, other_data} = ServiceB.fetch_data()
:ok = do_some_work(data, other_data)
Process.send_after(self(), :do_work, @one_hour)
{:noreply, state}
end
defmodule ServiceA do
def fetch_data() do
{:ok, [1, 2, 3, 4, 5]}
end
end
defmodule ServiceA do
def fetch_data() do
[1, 2, 3, 4, 5]
end
end
iex(4)> with {:ok, data}  ServiceA.fetch_data, do: :ok
[1, 2, 3, 4, 5]
iex(6)> {:ok, data} = ServiceA.fetch_data()
** (MatchError) no match of right hand side value: [1, 2, 3, 4, 5]
[error] GenServer Fail.Worker terminating
** (MatchError) no match of right hand side value: [1, 2, 3, 4, 5]
(fail) lib/fail/worker.ex:30: Fail.Worker.handle_info/2
(stdlib) gen_server.erl:615: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:681: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: :do_work
State: nil
SUMMARY
‣ Things will fail
‣ Fault tolerance isn't free
‣ Know your tools
‣ Think what you can handle
‣ Don't try to handle every possible error
‣ Think about supervision structure
‣ https://ferd.ca/the-zen-of-erlang.html
‣ https://medium.com/@jlouis666/error-kernels-9ad991200abd
‣ http://jlouisramblings.blogspot.com/2010/11/on-erlang-state-and-
crashes.html
‣ https://mazenharake.wordpress.com/2009/09/14/let-it-crash-the-
right-way/
‣ http://blog.plataformatec.com.br/2016/05/beyond-functional-
programming-with-elixir-and-erlang/
‣ https://mazenharake.wordpress.com/2010/10/31/9-erlang-pitfalls-
you-should-know-about/ ("Returning arbitrary {error, Reason}")
‣ http://mkaszubowski.pl/2017/09/02/On-Restoring-Process-State.html
THANK YOU!
mkaszubowski94
http://mkaszubowski.pl

More Related Content

What's hot

Avinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPressAvinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPresswpnepal
 
The road to continuous deployment (PHPCon Poland 2016)
The road to continuous deployment (PHPCon Poland 2016)The road to continuous deployment (PHPCon Poland 2016)
The road to continuous deployment (PHPCon Poland 2016)Michiel Rook
 
Ditching JQuery
Ditching JQueryDitching JQuery
Ditching JQueryhowlowck
 
TestFest - Respect\Validation 1.0
TestFest - Respect\Validation 1.0TestFest - Respect\Validation 1.0
TestFest - Respect\Validation 1.0Henrique Moody
 
Are statecharts the next big UI paradigm?
Are statecharts the next big UI paradigm? Are statecharts the next big UI paradigm?
Are statecharts the next big UI paradigm? Luca Matteis
 
Exceptions irst
Exceptions irstExceptions irst
Exceptions irstjkumaranc
 
OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019Ayesh Karunaratne
 
Build your own RESTful API with Laravel
Build your own RESTful API with LaravelBuild your own RESTful API with Laravel
Build your own RESTful API with LaravelFrancisco Carvalho
 
13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboardsDenis Ristic
 
Statecharts - Controlling the behavior of complex systems
Statecharts - Controlling the behavior of complex systemsStatecharts - Controlling the behavior of complex systems
Statecharts - Controlling the behavior of complex systemsLuca Matteis
 
A Journey with React
A Journey with ReactA Journey with React
A Journey with ReactFITC
 
Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)danwrong
 
Advanced modulinos trial
Advanced modulinos trialAdvanced modulinos trial
Advanced modulinos trialbrian d foy
 
CQRS & Event Sourcing in the wild (ScotlandPHP 2016)
CQRS & Event Sourcing in the wild (ScotlandPHP 2016)CQRS & Event Sourcing in the wild (ScotlandPHP 2016)
CQRS & Event Sourcing in the wild (ScotlandPHP 2016)Michiel Rook
 

What's hot (20)

Avinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPressAvinash Kundaliya: Javascript and WordPress
Avinash Kundaliya: Javascript and WordPress
 
Health Monitoring
Health MonitoringHealth Monitoring
Health Monitoring
 
The road to continuous deployment (PHPCon Poland 2016)
The road to continuous deployment (PHPCon Poland 2016)The road to continuous deployment (PHPCon Poland 2016)
The road to continuous deployment (PHPCon Poland 2016)
 
Ditching JQuery
Ditching JQueryDitching JQuery
Ditching JQuery
 
My Development Story
My Development StoryMy Development Story
My Development Story
 
Kyiv.py #17 Flask talk
Kyiv.py #17 Flask talkKyiv.py #17 Flask talk
Kyiv.py #17 Flask talk
 
TestFest - Respect\Validation 1.0
TestFest - Respect\Validation 1.0TestFest - Respect\Validation 1.0
TestFest - Respect\Validation 1.0
 
Laravel - PHP For artisans
Laravel - PHP For artisansLaravel - PHP For artisans
Laravel - PHP For artisans
 
Are statecharts the next big UI paradigm?
Are statecharts the next big UI paradigm? Are statecharts the next big UI paradigm?
Are statecharts the next big UI paradigm?
 
Exceptions irst
Exceptions irstExceptions irst
Exceptions irst
 
OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019
 
Build your own RESTful API with Laravel
Build your own RESTful API with LaravelBuild your own RESTful API with Laravel
Build your own RESTful API with Laravel
 
13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards13 PHPUnit #burningkeyboards
13 PHPUnit #burningkeyboards
 
Introduccion a Jasmin
Introduccion a JasminIntroduccion a Jasmin
Introduccion a Jasmin
 
Statecharts - Controlling the behavior of complex systems
Statecharts - Controlling the behavior of complex systemsStatecharts - Controlling the behavior of complex systems
Statecharts - Controlling the behavior of complex systems
 
Documentoliferay
DocumentoliferayDocumentoliferay
Documentoliferay
 
A Journey with React
A Journey with ReactA Journey with React
A Journey with React
 
Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)
 
Advanced modulinos trial
Advanced modulinos trialAdvanced modulinos trial
Advanced modulinos trial
 
CQRS & Event Sourcing in the wild (ScotlandPHP 2016)
CQRS & Event Sourcing in the wild (ScotlandPHP 2016)CQRS & Event Sourcing in the wild (ScotlandPHP 2016)
CQRS & Event Sourcing in the wild (ScotlandPHP 2016)
 

Similar to Let it crash - fault tolerance in Elixir/OTP

Php Chapter 1 Training
Php Chapter 1 TrainingPhp Chapter 1 Training
Php Chapter 1 TrainingChris Chubb
 
Ultimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesUltimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesAlan Arentsen
 
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...Codemotion
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Prxibbar
 
Phoenix for laravel developers
Phoenix for laravel developersPhoenix for laravel developers
Phoenix for laravel developersLuiz Messias
 
Tools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveTools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveJeff Smith
 
Interface de Voz con Rails
Interface de Voz con RailsInterface de Voz con Rails
Interface de Voz con RailsSvet Ivantchev
 
More than syntax
More than syntaxMore than syntax
More than syntaxWooga
 
Rails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity PresentationRails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity Presentationrailsconf
 
Ruby on rails
Ruby on rails Ruby on rails
Ruby on rails Mohit Jain
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialYi-Ting Cheng
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4Javier Eguiluz
 
Perl web app 테스트전략
Perl web app 테스트전략Perl web app 테스트전략
Perl web app 테스트전략Jeen Lee
 
Load Testing with PHP and RedLine13
Load Testing with PHP and RedLine13Load Testing with PHP and RedLine13
Load Testing with PHP and RedLine13Jason Lotito
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportBen Scofield
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weiboshaokun
 
Rooted 2010 ppp
Rooted 2010 pppRooted 2010 ppp
Rooted 2010 pppnoc_313
 
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014Greg Vaughn
 
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...Coupa Software
 

Similar to Let it crash - fault tolerance in Elixir/OTP (20)

Php Chapter 1 Training
Php Chapter 1 TrainingPhp Chapter 1 Training
Php Chapter 1 Training
 
Ultimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesUltimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examples
 
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Pr
 
Phoenix for laravel developers
Phoenix for laravel developersPhoenix for laravel developers
Phoenix for laravel developers
 
Tools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveTools for Making Machine Learning more Reactive
Tools for Making Machine Learning more Reactive
 
Interface de Voz con Rails
Interface de Voz con RailsInterface de Voz con Rails
Interface de Voz con Rails
 
More than syntax
More than syntaxMore than syntax
More than syntax
 
Migrating legacy data
Migrating legacy dataMigrating legacy data
Migrating legacy data
 
Rails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity PresentationRails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity Presentation
 
Ruby on rails
Ruby on rails Ruby on rails
Ruby on rails
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4
 
Perl web app 테스트전략
Perl web app 테스트전략Perl web app 테스트전략
Perl web app 테스트전략
 
Load Testing with PHP and RedLine13
Load Testing with PHP and RedLine13Load Testing with PHP and RedLine13
Load Testing with PHP and RedLine13
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack Support
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weibo
 
Rooted 2010 ppp
Rooted 2010 pppRooted 2010 ppp
Rooted 2010 ppp
 
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
 
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
Staying railsy - while scaling complexity or Ruby on Rails in Enterprise Soft...
 

Recently uploaded

React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
software engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptxsoftware engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptxnada99848
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 

Recently uploaded (20)

React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
software engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptxsoftware engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptx
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 

Let it crash - fault tolerance in Elixir/OTP