example | ||
lib | ||
.gitignore | ||
analysis_options.yaml | ||
CHANGELOG.md | ||
LICENSE | ||
pubspec.yaml | ||
README.md |
production
Helpers for concurrency, message-passing, rotating loggers, and other production functionality in Angel.
This will become the de-facto way to run Angel applications in deployed environments, as it takes care of inter-isolate communication, respawning dead processes, and other housekeeping for you automatically.
Most users will want to use the Runner
class.
Runner
Runner
is a utility, powered by package:args
, that is intended to be the entry point of your application.
Instantiate it as follows, and your file will become a command-line executable that spawns multiple instances of your application:
import 'dart:async';
import 'dart:isolate';
import 'package:angel_framework/angel_framework.dart';
import 'package:angel_production/angel_production.dart';
main(List<String> args) => new Runner('example', configureServer).run(args);
Future configureServer(Angel app) async {
app.get('/', (req, res) => 'Hello, production world!');
app.get('/crash', (req, res) {
// We'll crash this instance deliberately, but the Runner will auto-respawn for us.
new Timer(const Duration(seconds: 3), Isolate.current.kill);
return 'Crashing in 3s...';
});
}
Runner
will automatically re-spawn crashed instances, unless --no-respawn
is passed. This can prevent
your server from entirely going down at the first error, and adds a layer of fault tolerance to your
infrastructure.
When combined with systemd
, deploying Angel applications on Linux can be very simple.
Message Passing
The Runner
class uses package:pub_sub
to coordinate
message passing between isolates.
When one isolate sends a message, all other isolates will receive the same message, except for the isolate that sent it.
It is injected into your application's Container
as
pub_sub.Client
, so you can use it as follows: