Je vais juste tenter de résumer le message, un peu plus clairement.
Le probléme
On a fait un choix, c'était de partir sur la solution de Spacefox pour l'indexation des données. La solution en résumé, était de créé des tables spéciales pour la recherche qui ne servirait que pour l'indexation. Ces tables ont été créées et elles sont ici. Ces tables sont SearchIndexContent
, SearchIndexContainers
, SearchIndexExtracts
, SearchIndexAuthors
, SearchIndexTags
.
Mais ces tables doivent-être remplies, il est impossible de le faire à la publication de façon synchrone, car cette opération prend du temps et des IO. Pour rappel, c'est de cet ordre la:
- IO: 2 + (2*numbre de conteners) + nombre d'extrait
- Pour la base de données:
- En suppression 1+nombre de conteners+nombre d'extraits,
- En ajout 1+number de conteners + nombre d'extraits
Les solutions proposées
Deux solutions sont donc proposées soit de remplir les tables de la recherche à la publication de manière Asynchrone avec des Threads ou de remplir les tables plus tard avec une commande Django.
Première solution: remplir les tables à la publication avec un Thread
Lors de la publication, on lance un Thread, qui va remplir les tables de la recherches.
Les avantages sont les suivants:
- Tout est au même endroit dans le code, c'est un peu plus facile de s'y retrouver pour quelqu'un qui ne connaît pas le code.
- Pas obligé de recopier le markdown dans extra_contents
Les désavantages sont:
- La base de données de test ne supporte pas les Threads.
- SQLite prend très mal en charge la concurrence mais si une solution existe, c'est d'augmenter le timeout.
- Difficile de connaître le coût de l'indexation
- Si j'ai bien compris comment fonctionne l'ordonnanceur de Python, le Threading en Python est très limité (les threads tournent sur un seul coeur, séquentiellement) et on rallongera, de toute manière un peu la publication.
- Obligé de couper le site, si on veut copier les données des tables de la recherche à la demande. Exemple, un tutoriel s'est mal indexés, et on veut recopier les données des tables de recherches.
Deuxième solution: remplir les tables avec la commande
Lors de la publication, on flag le tutoriel en indiquant qu'il doit-être ré-indexé et on copie le repository markdown dans le dossier extra_content. Pour pouvoir y avoir accès après.
Plus tard, lors du lancement de la commande Django, on recherche tous les tutoriel avec un flag, et on remplis les tables de la recherche.
Les avantages sont les suivants:
- L'ajout des informations dans les tables de recherche est séparé de la publication
- On pourrais toujours si on veut changer le comportement plus tard et indexer à la publication
- On peut mesurer plus précisément le temps de chargement de l'indexation
- Le code de la publication est un peu long, si on peut le raccourcir de quelques lignes …
- Plus de Thread, plus de probléme.
Les inconvénients sont:
- Une commande de plus à taper à chaque fois
- Faut faire attention à ne pas lancer en même temps, la commande update_content et la commande rebuild_index de Solr.
- Obligé de recopier le dépot markdown dans le dossier extra_contents
Les avantages et inconvénients reflète ma façon de pensée, et n'est pas neutre, garder ça à l'esprit.
EDIT: Vous pouvez voir comment se comporte un peu la recherche sur le serveur Artragis.