Salut tout le monde,

J'aurai une question a vous poser concernant un cache que nous avons ajouter dans notre application au travail (Application de trading pour banque).

En gros, nous avons une classe java qui s'appelle CCPairService qui possede une methode static buildCcPair(String) qui a pour but de recevoir un string qui represente un symbol de change comme "EUR/USD" ou bien "EUR/GBP" voir des symbols du genre "EUR/USD-1M" dont le 1M correspond a une periode de paiement (Cette liste de periode est relativement reduite - une quinzaine) et de renvoyer un object java nomme CCPair.

Chaque string de type "EUR/USD" est extrait de message recu via le protocole financier FIX envoye par un "liquidity provider" (pour faire court, une banque) et est passe en parametre a CCPairService.buildCcPair(String) pour nous renvoyer l'objet java CCPair lui correspondant.
La methode appele ne fait rien de plus que de parser le parametre string via splits et creer l'objet CCPair via un appel a son constructeur..

Pouvant recevoir jusqu'a 6 mille messages par seconde, il etait important pour nous de creer un cache sur cette methode (en pure java) via une map pour eviter le travail de split qui nous prend du temps. En effet nous essayons d'economiser la moindre micro seconde car le system doit etre au maximum realtime.

L'algorithme qu'on utilise est des plus simple :
1. On recherche dans une map si l'objet CCPair est deja cree via la cle qui est le parametre string.
2. Si oui on le renvoi, si non on execute le traitement de parsing puis ajoutons l'objet dans la map.
3. On renvoit l'objet CCPair

Nous n'effectuons aucune suppression de la map jusqu'au redemarrage du logiciel car le nombre de possibilites de CCPair est limitee (une centaine maximum).

Mes questions sont les suivantes :

Sachant qu'un thread correspond a un ensemble de message envoye par un liquidity provider (a peu pret 3 a 4 message par seconde) et qu'il existe beaucoup de liquidity providers dans notre systeme,

1. Est il preferable d'utiliser une HashMap ou un ConcurrentMap pour le cache ?
En theorie quand on parle de multithreading, nous devons utiliser une Map thread safe, mais vu que l'on ne fait aucune suppression de la map (put() et get() uniquement), est ce que cela est il toujours preferable ?
Pour moi si j'utilise une concurrentMap, je vais perdre le parrallelisme des appels a la map car elle va serialiser les appels a cette derniere vu que celle ci est thread safe et donc "perdre" du temps.

2. Y'a t'il un scenario qui doit quand meme me contraindre a utiliser une ConcurentMap ?
3. Avez vous peut etre une autre recommandation sur la maniere d'implementer un cache (en prenant bien sur en compte du caractere real time du systeme et en pure JAVA - pas de @cacheable etc)
4. Suggestion ? je suis preneur


Merci de votre collaboration et desole pour l'absence d'accent, j'utilise un clavier QWERTY.