Por necesidades del desarrollo tuvimos que integrar un cliente WebSocket (WS) para recibir eventos de Deepstream (https://deepstreamhub.com/open-source/) en nuestra plataforma Polaris Industry.
La mayoría de estos clientes hacían uso de un bucle simple de “escucha” que nos llevó al mayor de todos los males, el problema de rendimiento. Teníamos un componente capaz de leer mensajes por WebSocket pero que devoraba toda la CPU disponible.
Necesitábamos reducir este bloqueo de nuestro componente y que se ejecutase en segundo plano sin bloquear al proceso principal y liberar el uso de recursos del sistema.
Nos encontramos con EventLoop de ReactPHP (https://github.com/reactphp/event-loop), que nos permite la creación de librerías asíncronas interoperables.
[php]
// [1] Instanciamos el bucle
$loop = ReactEventLoopFactory::create();
// [2] Añadimos el tiempo de on-off que hay entre cada ejecución del bucle y usamos un componente de React para la lectura de un fichero
$loop->addPeriodicTimer(1, function () {
echo "Tickn";
});
$stream = new ReactStreamReadableResourceStream(
fopen(‘file.txt’, ‘r’),
$loop
);
// [3] Iniciamos el bucle
$loop->run();
[/php]
Esta es la base del cliente de WebSocket que estamos usando en nuestra aplicación (https://github.com/6phere/php-websocket/), nos ha permitido reducir significativamente tanto el uso de CPU, como de memoria RAM.
CONOCIMIENTO / Descargables
EBook gratuito
eficiencia OEE
Descubre las particularidades del indicador OEE, cómo automatizar su cálculo y que requisitos deben cumplir tus procesos de producción para implementarlo.