Il me semble que vous avez ici quelques technologies mixtes:
communications (sur lesquelles vous comptez essentiellement comme étant 100% fiables ... ce qui peut être fatal)
verrouillage / exclusion mutuelle
délais d'attente (dans quel but)?
Un mot d'avertissement: les délais d'attente dans les systèmes distribués peuvent être lourds de dangers et de difficultés. S'ils sont utilisés, ils doivent être définis et utilisés très soigneusement car l'utilisation aveugle des délais d'attente ne résout pas un problème, elle reporte simplement la catastrophe. (Si vous voulez voir comment les délais d'attente doivent être utilisés, lisez et comprenez la documentation du protocole de communication HDLC. C'est un bon exemple d'utilisation appropriée et intelligente, en combinaison avec un système de codage de bits intelligent pour permettre la détection de choses comme la ligne IDLE) .
Pendant un certain temps, j'ai travaillé dans des systèmes distribués multiprocesseurs connectés via des liaisons de communication (pas TCP, autre chose). L'une des choses que j'ai apprises, c'est qu'en général, il y a des endroits dangereux pour la multi-programmation:
la dépendance aux files d'attente se termine généralement en larmes (si la file d'attente se remplit, vous avez des problèmes. À MOINS que vous puissiez calculer une taille de file d'attente qui ne se remplira jamais, auquel cas vous pourriez probablement utiliser une solution sans file d'attente)
la dépendance au verrouillage est douloureuse, essayez de penser s'il existe un autre moyen (si vous devez utiliser le verrouillage, regardez la littérature, le verrouillage distribué multiprocesseur a fait l'objet de nombreux articles acédémiques des 2-3 dernières décennies)
Si vous devez continuer à utiliser le verrouillage, alors:
Je suppose que vous n'utiliserez les délais d'attente que comme moyen de récupération de dernier recours, c'est-à-dire pour détecter une défaillance du système de communication sous-jacent. Je suppose en outre que votre système de communication TCP / IP a une bande passante élevée et peut être considéré comme une faible latence (idéalement zéro, mais cela ne se produit jamais).
Ce que je suggère, c'est que chaque nœud possède une liste de connectivité d'autres nœuds auxquels il peut se connecter. (Les nœuds ne se soucient pas d'où vient une connexion.) La population des tables auxquelles les nœuds peuvent se connecter est laissée comme une chose distincte à trier, vous n'avez pas dit si cela serait défini statiquement ou non. Des éléments tels que l'attribution des numéros de port IP où les connexions entreraient dans un nœud sont également ignorés de manière pratique - il peut y avoir de bonnes raisons d'accepter des demandes sur un seul port ou sur plusieurs ports. Cela doit être soigneusement examiné. Les facteurs incluront la mise en file d'attente implicite, la commande, l'utilisation des ressources, le type de système d'exploitation et les capacités.
Une fois que les nœuds savent à qui ils se connectent, ils peuvent envoyer à ce nœud une demande de verrouillage et doivent recevoir une réponse de verrouillage de ce nœud distant. Vous pouvez regrouper ces deux opérations dans un wrapper pour lui donner un aspect atomique. Cela a pour effet que les nœuds souhaitant acquérir un verrou feront un appel quelque chose comme:
if (get_lock(remote_node) == timeout) then
{
take some failure action - the comms network is down
}
/* Lock is now acquired - do work here */
if (release_lock(remote_node) == timeout) then
{
take some failure action - the comms network is down
}
les appels get_lock et release_lock devraient être quelque chose comme (en principe):
send_to_remote_node(lock_request)
get_from_remote_node_or_timeout(lock_reply, time)
if (result was timeout) then
return timeout
else
return ok
Avec un système de verrouillage distribué, vous devrez faire très attention que les unités de travail effectuées pendant le verrouillage sont petites et rapides car vous aurez de nombreux nœuds distants potentiellement bloqués en attente pour obtenir un verrou. Il s'agit en fait d'un système multiprocesseur / communication d'arrêt et d'attente qui est robuste mais qui n'a pas les meilleures performances possibles.
Une suggestion est d'adopter une approche complètement différente. Pouvez-vous utiliser un appel de procédure à distance où chaque appel RPC transporte un ensemble d'informations qui peuvent être traitées par le destinataire et qui supprime les besoins de verrous?
En relisant la question, il semble que vous ne vouliez pas vraiment vous soucier du côté communication des choses, vous voulez juste résoudre votre problème de verrouillage.
Ma réponse peut donc sembler un peu hors sujet, cependant, je pense que vous ne pouvez pas résoudre votre problème de verrouillage sans obtenir les bonnes pièces en dessous. Analogie: Construire une maison sur de mauvaises fondations la fait tomber ... Finalement.