/** * Calculate the node priority from its job count, stick to the current node * * As the priority is based on the number of jobs, higher is better. * * @param Node $node * @param string $currentNodeId * * @return float Node priority */ private function calculateNodePriority(Node $node, $currentNodeId) { $priority = $node->getJobCount(); if ($node->getId() === $currentNodeId) { $margin = 1 + $this->marginToSwitch; $priority = $priority * $margin; } // Apply a weight determined by the node priority as assigned by Disque. // Priority 1 means the node is healthy. // Priority 10 to 100 means the node is probably failing, or has failed $disquePriority = $node->getPriority(); // Disque node priority should never be lower than 1, but let's be sure if ($disquePriority < Node::PRIORITY_OK) { $disquePriorityWeight = 1; } elseif (Node::PRIORITY_OK <= $disquePriority && $disquePriority < Node::PRIORITY_POSSIBLE_FAILURE) { // Node is OK, but Disque may have assigned a lower priority to it // We use the base-10 logarithm in the formula, so priorities // 1 to 10 transform into a weight of 1 to 0.5. When Disque starts // using more priority steps, priority 9 will discount about a half // of the job count. $disquePriorityWeight = 1 / (1 + log10($disquePriority)); } else { // Node is failing, or it has failed $disquePriorityWeight = 0; } $priority = $priority * $disquePriorityWeight; return (double) $priority; }