Donc, à un niveau élevé, mon cas d'utilisation est le suivant -
Je reçois périodiquement (toutes les 24 heures) un très gros fichier (la taille peut varier de Mo à 10 s de Go) que je dois traiter dans les 24 heures. Le traitement implique la lecture d'un enregistrement, l'application d'une logique métier et la mise à jour d'une base de données avec l'enregistrement.
Solution actuelle est une version à thread unique qui
Cela fonctionne pour les petits fichiers avec moins de 10 millions d'enregistrements. Mais à mesure que les systèmes évoluent, nous obtenons plus de charge, c'est-à-dire des fichiers plus volumineux (avec> 100 millions d'enregistrements occasionnellement). Dans ce scénario, nous voyons des délais d'attente, c'est-à-dire que nous ne pouvons pas traiter l'intégralité du fichier dans les 24 heures.
Je prévois donc d'ajouter de la concurrence ici.
Une solution simple serait-
Cette solution semble simple, le seul inconvénient que je vois est que l'analyse de fichiers peut prendre du temps car elle est monothread (la RAM n'est pas un problème, j'utilise une assez grande instance EC2).
Une autre solution serait de -
Cela semble légèrement compliqué car je devrais diviser le fichier en plusieurs fichiers plus petits.
Toute contribution sur les suggestions ici sur les approches serait la bienvenue.
La façon la plus efficace de le faire est:
Vous voudrez peut-être utiliser Spring Batch pour cela, car cela vous guidera vers la bonne chose. Mais il est quelque peu sur-conçu et difficile à utiliser.
Gardez à l'esprit que tout cela pourrait encore être inutile si la base de données devient votre goulot d'étranglement, ce qui peut très facilement être le cas - les bases de données SQL sont notoirement mauvaises pour gérer les mises à jour simultanées, et cela peut nécessiter un certain nombre de réglages pour éviter les conflits de verrous et impasses.
Commençons par une arithmétique de base.
(* 24 60 60)
86400
Cela signifie qu'il y a 86400 secondes en une journée.
(/ 100e6 86400)
1157.4074074074074
Cela signifie que pour traiter 100 millions d'enregistrements en une journée, vous devez pouvoir traiter 1157,4 enregistrements par seconde.
Aller plus loin:
(/ 1.0 1157.4074074074074)
0.000864
Cela signifie que vous devez pouvoir traiter un enregistrement, de bout en bout, en 864 microsecondes.
Peu importe ce que vous faites, c'est une vérité fondamentale. S'il faut plus de 864 microsecondes pour traiter un enregistrement complètement, vous ne pourrez pas traiter 100 millions d'enregistrements en 24 heures.
L'ajout de "threading" ne fera qu'empirer, pas améliorer, car vous ajoutez des frais généraux et ne supprimez aucune charge de travail sous-jacente.
Je soupçonne, après près de 40 ans dans cette raquette folle, que lire le fichier en mémoire et écrire les résultats dans votre SGBD vous mange vivant.