Meilleures pratiques de programmation fonctionnelle Scala ou Clojure

11

J'ai fait beaucoup de codage d'auto-apprentissage, j'ai acquis de l'expérience avec les modèles de programmation parallèle: acteurs, mémoire transactionnelle logicielle, flux de données.

Lorsque j'essaie d'appliquer ces architectures à la vie réelle - dans une application Web à charge élevée - aucun modèle ne prend en charge la durabilité et la persistance des données. Les tâches réelles nécessitent de sauvegarder les données à la fin. Cela signifie que je dois encore utiliser des synchronisations DB et trapping DB, des goulots d'étranglement, etc.

Quelqu'un connaît-il un bon exemple d'architecture (src ou texte ou diagramme ou plans) qui utilise les acteurs Akka ou la mémoire de transaction logicielle et implémente la persistance à la fin?

Tout bon exemple / idée de mémoire transactionnelle, d'acteurs, de flux de données, d'espaces de tuple dans des applications réelles est le bienvenu.

moucheron
la source
Avez-vous besoin à la fois d'akka et de stm?
om-nom-nom
Il semble inhabituel que vous considériez la persistance comme «à la fin». Je crois que les "synchronisations de DB de piégeage, goulots d'étranglement d'évolutivité possibles, etc." sont un problème précisément parce qu'ils sont au milieu des choses plutôt qu'à la fin.
Dan Burton
Convenez que la persistance se produit plus souvent qu'à la fin
@Stas Quel est le lien entre la question et (1) Scala et Clojure, (2) les meilleures pratiques? Ce que j'ai lu est (1) indépendant du langage et (2) lié uniquement à la concurrence (en particulier Durabilité / Persistance).
sakisk

Réponses:

5

Les modèles d'acteur / STM et la persistance de la base de données sont quelque peu orthogonaux - vous pouvez facilement avoir l'un sans l'autre, et je pense qu'il y a un risque de confondre les deux.

Atteindre la durabilité (le D dans ACID) est extrêmement complexe dans un environnement transactionnel, et en particulier dans un environnement distribué où vous avez des acteurs / processus coordonnés par la transmission de messages. Vous entrez dans des problèmes épineux comme le problème des généraux byzantins .

En conséquence, je pense qu'il y aura toujours un certain degré de personnalisation de la solution pour répondre à vos besoins de persistance spécifiques. Il n'y a pas de solution «taille unique».

A voir (perspective Clojure):

mikera
la source
5

Le modèle d'acteur fonctionne assez bien avec la séparation de responsabilité de commande / requête (CQRS) , car les messages aux acteurs qui effectuent la manipulation de données peuvent être utilisés comme équivalents de "commande".

Alors, qu'est-ce que cela a à voir avec votre problème de persistance? Eh bien, vous travaillez sur la mémoire et écrivez toutes les commandes dans un journal, ce qui est une opération moins coûteuse car elle est uniquement en ajout, et vider les instantanés de temps en temps pour réduire le temps nécessaire pour recharger la base de données si nécessaire (plus la possibilité de récupérer l'espace utilisé par le journal).

Il s'agit d'une technique assez courante. Regardez VoltDB et Redis pour plus d'inspiration.

Daniel C. Sobral
la source
4

Rich Hickey a une toute nouvelle idée baptisée Datomic. Il s'agit d'une nouvelle approche de la persistance, du découplage du stockage, de la gestion des transactions et des requêtes. Il est basé sur des enregistrements immuables et utilise un langage de requête appelé Datalog (partage les fonctionnalités avec Prolog). L'objectif principal était de permettre une distribution et un déploiement cloud faciles. Il s'appuie sur le stockage en tant que service (donc pas une implémentation concrète, mais faiblement couplé via une API over-the-wire).

A Clojure, nous avons STM qui nous donne ACI, le D manquant. Datomic ajoute le D.

Marko Topolnik
la source