These are some notes on stuff I discovered when delving into running Sneakers workers on Kube recently.

Allow Sneakers to receive SIGTERM

Sneakers has good graceful shutdown handling built-in. When it receives SIGTERM, Sneakers will:

  1. Stop consuming the queue
  2. Finish any work that’s in progress on messages that have already been pulled from the queue.
  3. Terminate

In the context of Kube, it’s important that Sneakers runs on PID 1. This is because only the process on PID 1 will receive the SIGTERM from Kube. To ensure this make sure the command is:

command: ["bundle", "exec", "rake", "sneakers:run"]

It’s important it’s in the array format (command…


As a fledgling programmer you’re bombarded by commandments telling you what’s considered right programming and wrong programming. These edicts can seem very useful and on the surface seem irrefutable. But if they are applied without deeper thought they can do more harm than good. One of the worst offenders is ‘thy code shalt have abundant comments’. Another questionable one is the DRY principle.

‘DRY’ is an acronym meaning: Don’t Repeat Yourself. It is often interpreted to mean there should be no similar blocks of code in a codebase. And certainly no copy-pasted code. But in my opinion this interpretation is…


This article summaries a solution to the problem of calling and listing commands in Symfony Console when at least one of the commands is not instantiable.

The problem

By default, Symfony will instantiate all your application’s commands when initialising. If just one of the commands fails to initialize, the entire application will fail — even when executing a command that works fine.

Ordinarily, this shouldn’t be a problem. After all, classes should be instantiable, shouldn’t they? But, in my work at Funeral Zone, we have a use-case of a console application that sits in multiple microservices. Some of the commands in the…


This article is about convenient and safe mutations of composite value objects that implement the null object pattern.

Here’s an example of a composite value object. It’s a user that has two subtypes: an email address and a name.

final class User
{
private $emailAddress;
private $name;
public function getEmailAddress(): EmailAddress
{
return $this->emailAddress;
}
public function getName(): Name
{
return $this->name;
}
public function withName(Name $name): User
{
$native = $this->toNative();
$native['name'] = $name->toNative();
return self::fromNative($native);
}
}

To mutate the name of a User you take an existing object and call the withName method on it. This method…


In this article I explain why I’ve grown to accept trailing commas in code. Consider the following two examples:

A:

$characters = [
'Odo',
'Sisko',
'Garak',
];

B:

$characters = [
'Odo',
'Sisko',
'Garak'
];

Which one looks neater?

Personally I think B is neater. It’s also grammatically correct. The list does not continue after ‘Garak’. I’ve coded arrays like this for years.

The JSON specification gave me added justification. Strict JSON does not allow trailing commas. This was for browser compatibility reasons. It’s also faster to parse.

But recently I’ve been persuaded to let it go (🎶). Apart from…


I’m going to share a few optimisations you can make to speed up composer installs in Docker builds.

  1. Prestissimo
  2. Turn off Xdebug
  3. Composer install before codebase

1. Prestissimo

Prestissimo is a spiffing plugin for Composer which parallelises all the downloads. You just have to install it to see sometimes large speed increases — no configuration is needed. Installing it locally is simple as:

composer global require hirak/prestissimo

To leverage it in a Docker build, install Composer in your Dockerfile with the following:

RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer && composer global require hirak/prestissimo --no-plugins --no-scripts

2. Turn off Xdebug

Composer runs much…


At my company, Funeral Zone, we’re into Domain Driven Design. We’ve been writing value objects in PHP for two years but have recently refined our approach. This article explains our philosophy behind implementing value objects in PHP 7.

We’ve open-sourced our value objects library on Github.

Quick introduction to value objects

A value object is a concept from Domain Driven Design. They are objects whose equality is not dependent on identity.

$location1 = new Location(1.2902, 103.8519);
$location2 = new Location(1.2902, 103.8519);

$location1 and $location2 are considered equal because they both have the same latitude and longitude. The definition of a Location is purely based on…


On December 7th 2017 I gave a talk at Tech Exeter about event sourcing.

In a nutshell, event sourcing is about changing your persistence strategy to be event-centric as opposed to data-centric.

Tech Exeter is a community, conference and co-working space for tech people in Exeter, UK.

Chris Harrison

Software engineer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store