Dynamically Create and Destroy Servers with this Laravel Package
Published on by Paul Redmond
Laravel Dynamic Servers is a package by Spatie that helps you start and stop servers when needed. The primary use case is creating extra servers to help you with queue workloads.
You might be wondering, "why not just use Kubernetes?" In the author's blog post A package to manage dynamic servers, Freek Van der Herten said:
You can think of laravel-dynamic-servers as a sort of PHP-based version of Kubernetes that has 5% of its features but covers that 80% use case. For most PHP and Laravel developers, this package will also be easier to learn and use.
So while you could solve these problems in other ways, this package might perfect for your needs to scale servers up and down.
Here's an example callback you might add to calculate how many servers to ensure are running based on whatever logic you need:
// In a service provideruse Spatie\DynamicServers\Facades\DynamicServers;use Spatie\DynamicServers\Support\DynamicServersManager; DynamicServers::determineServerCount(function(DynamicServersManager $servers) { // Custom logic to decide how many servers are needed. // This callback runs every minute. $numberOfServersNeeded = 5; $servers->ensure($numberOfServersNeeded);});
The package's readme example uses Horizon's WaitTimeCalculator
to determine how many servers to ensure. The above callback would run each minute to scale up and down, depending on what you need.
Some of the other highlights of what this package offers:
- Ensuring a number of servers are running
- Rebooting servers
- Ability to handle multiple server types
- Manually increasing/decreasing the number of servers
- Custom service provider
- Configurable hard limit on the number of servers
Out of the box, this package has a server provider for UpCloud. However, you can create a custom provider for your favorite cloud service provider.
Check out the documentation to get started with this package. The source code is open-source on GitHub at spatie/laravel-dynamic-servers.