Bon cas d'utilisation pour Akka [fermé]


605

J'ai entendu beaucoup de délires sur le cadre Akka (plate-forme de service Java / Scala), mais jusqu'à présent, je n'ai pas vu de nombreux exemples réels de cas d'utilisation, ce serait bon. Je serais donc intéressé à entendre parler de ce que les développeurs ont utilisé avec succès.

Une seule limitation: veuillez ne pas inclure le cas de l'écriture d'un serveur de chat. (pourquoi? puisque cela a été abusé comme exemple pour beaucoup de choses similaires)


10
N'est-il pas plus facile de commencer par le problème et de trouver une solution, que d'avoir une solution et de chercher un problème pour l'appliquer? Je suppose qu'à la place, en utilisant RMI, Akka et ses acteurs semblent beaucoup plus faciles / plus simples à écrire du code.
Kennet

67
Oui, si j'avais un problème spécifique à résoudre. Je ne cherche en aucun cas une "excuse pour utiliser Akka", mais je souhaite en savoir un peu plus. Cela peut aussi aider à résoudre les problèmes futurs, mais c'est surtout pour le processus d'apprentissage en cours.
StaxMan

Il y a une question connexe mais sur l'application d'AKKA pour une application existante + quelques cas d'utilisation: stackoverflow.com/questions/16595685/…
ses

2
Akka est une meilleure solution que JMS ou un système de file d'attente de messages distribués de style MQ. C'est la meilleure façon de le comprendre pour moi qui posait récemment exactement la même question: "Je comprends comment l'utiliser et voir où je pourrais l'utiliser, mais je ne vois pas où cela fournirait un réel avantage". Les hypothèses de conception de base d'Akka sont bien meilleures que celles de JMS / MQ, en particulier en ce qui concerne l'isolation des processus, la conception sans verrouillage et la gestion des tentatives / échecs. Deuxièmement, l'API est beaucoup plus élégante que les outils JMS / MQ.
user2684301

2
@ user2684301 hmmh. Je trouve cette réponse un peu injuste, de la pomme aux oranges. Les MQ sont (logiquement) des blocs de construction simples qui font beaucoup moins que Akka, et je ne les comparerais pas côte à côte. Mais je suppose que si je le lis comme "par rapport aux systèmes distribués construits en utilisant JMS, écrit de manière déclarative" alors cela aurait plus de sens.
StaxMan

Réponses:


321

Je l'ai utilisé jusqu'à présent avec succès dans deux projets réels. les deux se situent dans le domaine de l'information sur le trafic en temps quasi réel (trafic comme dans les voitures sur les autoroutes), répartis sur plusieurs nœuds, intégrant des messages entre plusieurs parties, des systèmes backend fiables. Je ne suis pas encore libre de donner des détails sur les clients, quand j'obtiens le OK, il peut être ajouté comme référence.

Akka a vraiment réussi sur ces projets, même si nous avons commencé quand il était sur la version 0.7. (au fait, nous utilisons scala)

L'un des grands avantages est la facilité avec laquelle vous pouvez composer un système à partir d'acteurs et de messages avec presque aucun passe-partout, il évolue extrêmement bien sans toutes les complexités du filetage roulé à la main et vous obtenez un message asynchrone passant entre les objets presque gratuitement.

Il est très bon dans la modélisation de tout type de gestion de messages asynchrone. Je préférerais écrire n'importe quel type de système de services (Web) dans ce style que tout autre style. (Avez-vous déjà essayé d'écrire un service Web asynchrone (côté serveur) avec JAX-WS? C'est beaucoup de plomberie). Je dirais donc tout système qui ne veut pas s'accrocher à l'un de ses composants car tout est implicitement appelé à l'aide de méthodes synchrones, et qu'un composant se verrouille sur quelque chose. Il est très stable et la solution Let-it-crash + superviseur à l'échec fonctionne vraiment bien. Tout est facile à configurer par programme et pas difficile à tester.

Ensuite, il y a les excellents modules complémentaires. Le module Camel se connecte vraiment bien à Akka et permet un développement aussi simple de services asynchrones avec des points de terminaison configurables.

Je suis très satisfait du cadre et il devient une norme de facto pour les systèmes connectés que nous construisons.


14
Quel est l'avantage de cette approche par rapport à l'utilisation d'un backend de messagerie (par exemple ActiveMQ) pour le passage de messages à votre avis?
magiconair

27
Les produits MQ sont vraiment destinés à un cas d'utilisation différent. différentes garanties et performances très différentes. Les produits MQ nécessitent beaucoup de configuration, vous n'utiliseriez pas de files d'attente dans un tel produit de la même manière que vous utiliseriez des objets. Les acteurs sont des citoyens de première classe dans akka, vous les utilisez comme vous le souhaitez, de la même manière que vous utiliseriez des objets, il y a donc beaucoup moins de frais généraux à la fois dans votre modèle de programmation et dans la configuration. Les produits MQ que vous utiliseriez davantage pour s'intégrer à d'autres systèmes externes, et non pour construire les «éléments internes» d'un système, ce pour quoi vous utiliseriez des acteurs.
Raymond Roestenburg

26
Nouvelle URL pour l'étude de cas DBP est downloads.typesafe.com/website/casestudies/...
Bas

2
Bâtir @RaymondRoestenburg re: systèmes MQ et alternatives. RabbitMQ, par exemple, est construit sur un langage de programmation basé sur les acteurs, Erlang. C'est une façon de penser la relation (et la distinction) entre l'acteur et MQ. Pendant ce temps, Apache Spark n'est ni basé sur les travailleurs et les files d'attente, ni sur les acteurs, MAIS peut être utilisé avec Akka: Typesafe montre comment utiliser Spark Streaming avec Akka .
driftcatcher

6
@RaymondRoestenburg Vous avez négligé de mentionner que le modèle Actor tel quel favorise une structure de type spaghetti. Le livre "Akka en action" que vous avez écrit est la meilleure démonstration de cette "fonctionnalité". Les exemples de code traitent d'histoires assez basiques. Pourtant, le flux de travail est très difficile à comprendre et à suivre à partir du code. Un problème connexe est que le code Akka sera irréversiblement dans toute votre logique métier de la manière la plus intrusive que vous puissiez imaginer. Beaucoup plus que tout autre cadre non acteur. Il est tout simplement impossible d'écrire un flux de travail de base sans le disséquer dans différentes sections distinctes.
ravi

222

Avertissement: je suis le bon de commande d'Akka

En plus d'offrir un smorgasbord de concurrence qui est beaucoup plus simple à raisonner et à obtenir correctement (acteurs, agents, concurrence de flux de données) et avec un contrôle de concurrence sous la forme de STM.

Voici quelques cas d'utilisation que vous pourriez envisager:

  1. Traitement des transactions (jeux en ligne, finance, statistiques, paris, réseaux sociaux, télécoms, ...)
    • évoluer, évoluer, tolérance aux pannes / HA
  2. Backend de service (toute industrie, toute application)
    • service REST, SAVON, cometd etc.
    • agir comme concentrateur de messages / couche d'intégration
    • évoluer, évoluer, tolérance aux pannes / HA
  3. Simultanéité / parallélisme enfichable (n'importe quelle application)
    • Correct
    • Facile à travailler et à comprendre
    • Ajoutez simplement les jars à votre projet JVM existant (utilisez Scala, Java, Groovy ou JRuby)
  4. Traitement par lots (toute industrie)
    • Intégration Camel pour se connecter aux sources de données par lots
    • Les acteurs divisent et conquièrent les charges de travail par lots
  5. Pôle de communication (télécom, web média, média mobile)
    • évoluer, évoluer, tolérance aux pannes / HA
  6. Serveur de jeux (jeux en ligne, paris)
    • évoluer, évoluer, tolérance aux pannes / HA
  7. BI / datamining / crunching à usage général
    • évoluer, évoluer, tolérance aux pannes / HA
  8. insérez ici d'autres jolis cas d'utilisation

10
Je comprends les avantages de Futures et STM mais je ne trouve pas de bons cas d'utilisation pour les acteurs. Pour un serveur de jeux ou de paris, quel est l'avantage d'utiliser Actors vs plusieurs serveurs d'applications derrière un équilibreur de charge?
Martin Konicek

8
@ PO ViktorKlang! = Responsable technique. Ils travaillent ensemble, mais ont des rôles différents.
taylorcressy

79

Un exemple de la façon dont nous l'utilisons serait dans une file d'attente prioritaire de transactions par carte de débit / crédit. Nous en avons des millions et l'effort du travail dépend du type de chaîne d'entrée. Si la transaction est de type CHECK, nous avons très peu de traitement, mais s'il s'agit d'un point de vente, il y a beaucoup à faire, comme la fusion avec les métadonnées (catégorie, étiquette, tags, etc.) et fournir des services (alertes e-mail / sms, détection de fraude, solde de fonds bas, etc.). Sur la base du type d'entrée, nous composons des classes de divers traits (appelés mixins) nécessaires pour gérer le travail et ensuite effectuer le travail. Tous ces travaux entrent dans la même file d'attente en mode temps réel de différentes institutions financières. Une fois que les données sont nettoyées, elles sont envoyées à différents magasins de données pour la persistance, l'analyse, ou poussées vers une connexion socket, ou pour lever l'acteur comète. Les acteurs actifs équilibrent constamment le travail afin que nous puissions traiter les données le plus rapidement possible. Nous pouvons également intégrer des services supplémentaires, des modèles de persistance et pour les points de décision critiques.

Le message de style Erlang OTP transmis à la JVM constitue un excellent système pour développer des systèmes en temps réel sur les épaules des bibliothèques et des serveurs d'applications existants.

Akka vous permet de faire passer un message comme vous le feriez dans un traditionnel mais avec rapidité! Il vous fournit également des outils dans le cadre pour gérer la grande quantité de pools d'acteurs, de nœuds distants et de tolérance aux pannes dont vous avez besoin pour votre solution.


1
Est-il donc juste de dire qu'il s'agit de (certaines) demandes à longue latence, où un seul thread par demande ne serait pas bien adapté?
StaxMan

7
Je pense que la partie importante de la programmation des acteurs en général est le flux de messages. Une fois que vous commencez à conceptualiser des flux de données qui n'ont pas d'effets secondaires, vous souhaitez simplement que le plus grand nombre possible de flux se produise par nœud. Ceci est très différent du calcul haute performance où vous avez des tâches semi-homogènes qui n'envoient pas de messages et prennent beaucoup de temps à traiter. Je pense qu'une mise en œuvre de Fibonacci basée sur un acteur est un exemple très limitatif car elle ne montre pas pourquoi utiliser des acteurs mais seulement que les acteurs paralysent les taks. Pensez à l'architecture pilotée par les événements pour les cas d'utilisation.
Wade Arnold

4
L'architecture événementielle est une façon différente de penser les problèmes. Il vaut la peine de lire Erlang OTP in Action de manning si vous songez à coder en Akka. Beaucoup de constructions dans akka sont influencées par Erlang OTP et le livre vous donne les principes pour lesquels Jonas Boner a construit akka api comme il l'a fait. Akka est une grande montagne sur laquelle vous vous tenez! Si vos acteurs persistent à travers des changements d'état, avez-vous vraiment besoin de 10k écrit une seconde soutenue
Wade Arnold

8
Wade, comment gérez-vous les garanties de message? vous mentionnez: (alertes e-mail / sms, détection de fraude, solde de fonds bas, etc.), je suppose que celles-ci sont potentiellement envoyées à des acteurs distants? Comment assurez-vous que ces opérations se sont réellement déroulées? que faire si le nœud a échoué lors du traitement d'une alerte à la fraude? Est-ce parti pour toujours? Avez-vous un système éventuellement cohérent qui le nettoie? Merci!
James

2
Bonne question James. Il est évident qu'elle s'inscrit dans un système où une réponse n'est pas nécessaire de toute urgence. Par exemple, vous pouvez traiter les factures de carte de crédit; calculer; envoyer un e-mail, etc. Je me demande vraiment comment ces choses (transaction) sont traitées lorsqu'une réponse est nécessaire. À la fin; si une demande est faite de l'extérieur (internaute; un représentant du centre d'appels, etc.); il ou elle attend une réponse. Comment puis-je être sûr que les sous-tâches (qui sont exécutées en mode asynchrone) sont exécutées; dans une transaction xa afin que je puisse retourner une réponse?
Kaan Yy

44

Nous utilisons Akka pour traiter les appels REST de manière asynchrone - avec le serveur Web asynchrone (basé sur Netty), nous pouvons améliorer de 10 fois le nombre d'utilisateurs servis par nœud / serveur, par rapport au modèle de demande de thread traditionnel par utilisateur.

Dites à votre patron que votre facture d'hébergement AWS va chuter du facteur 10 et c'est une évidence! Chut ... ne le dites pas à Amazon cependant ... :)


3
Et j'ai oublié de mentionner que la nature monadique des futurs akka, qui conduit à un code parallèle beaucoup plus propre, nous a fait économiser des milliers de
dollars en

8
Je suppose que les appels sont à haute latence et à faible débit? Comme passer des appels vers d'autres serveurs, attendre une réponse (proxy)?
StaxMan

38

Nous utilisons Akka dans un projet Telco à grande échelle (malheureusement, je ne peux pas divulguer beaucoup de détails). Les acteurs Akka sont déployés et accessibles à distance par une application Web. De cette façon, nous avons un modèle RPC simplifié basé sur Google protobuffer et nous réalisons le parallélisme en utilisant Akka Futures. Jusqu'à présent, ce modèle a parfaitement fonctionné. Une remarque: nous utilisons l'API Java.


Pourriez-vous nous en dire un peu plus s'il vous plaît? Afaik Futures ne peut pas être envoyé par câble (sérialisé). Utilisez-vous beaucoup de futurs et peu d'acteurs ou un mix entre les deux ou ...? Vous utilisez protobuf pour toute sérialisation et envoyez comme message aux acteurs?
Aktau

Il semble que cela aurait pu être géré aussi facilement sans Akka.
Erik Kaplun

1
TDC est une entreprise de télécommunications dans le cas de Fiaddesio.
Roman Kagan

37

Si vous extrayez le serveur de chat d'un niveau, vous obtenez la réponse.

Akka fournit un système de messagerie qui s'apparente à la mentalité de "laisser tomber" d'Erlang.

Les exemples sont donc des choses qui nécessitent différents niveaux de durabilité et de fiabilité de la messagerie:

  • Serveur de chat
  • Couche réseau pour un MMO
  • Pompe de données financières
  • Système de notification pour iPhone / mobile / n'importe quelle application
  • Serveur REST
  • Peut-être quelque chose qui ressemble à WebMachine (devinez)

Les bonnes choses à propos d'Akka sont les choix qu'il offre pour la persistance, c'est l'implémentation STM, le serveur REST et la tolérance aux pannes.

Ne vous fâchez pas avec l'exemple d'un serveur de chat, pensez-y comme un exemple d'une certaine classe de solution.

Avec toute leur excellente documentation, j'ai l'impression qu'une lacune est cette question exacte, les cas d'utilisation et les exemples. Garder à l'esprit que les exemples ne sont pas anodins.

(Écrit avec une seule expérience de regarder des vidéos et de jouer avec la source, je n'ai rien mis en œuvre en utilisant akka.)


2
Merci - je ne voulais pas dire que le serveur de chat est nécessairement mauvais, juste que je voudrais des exemples complémentaires; plus facile de se faire une meilleure idée du potentiel.
StaxMan

Curieux de savoir comment le serveur REST s'inscrit ici? Le mentionnez-vous dans le contexte du serveur asynchrone de style Node.js? Merci d'avoir partagé les exemples d'utilisation. Je les ai trouvés utiles.
software.wikipedia

24

Nous utilisons Akka dans plusieurs projets au travail, dont le plus intéressant est lié à la réparation de crash de véhicule. Principalement au Royaume-Uni, mais s'étend désormais aux États-Unis, en Asie, en Australasie et en Europe. Nous utilisons des acteurs pour garantir que les informations sur les réparations après accident sont fournies en temps réel pour permettre la réparation sûre et rentable des véhicules.

La question avec Akka est vraiment plus «que ne pouvez-vous pas faire avec Akka». Sa capacité à s'intégrer à des frameworks puissants, sa puissante abstraction et tous les aspects de tolérance aux pannes en font une boîte à outils très complète.


Alors, quel aspect aimez-vous le plus si vous deviez choisir? Intégration existante pour d'autres frameworks, tolérance de panne automatique ou autre chose?
StaxMan

6
D'un point de vue personnel, c'est le niveau d'abstraction élevé qu'Akka apporte à la table que j'aime le plus. Du point de vue de l'entreprise, ce sont les capacités d'intégration.
Je dois gagner ma

Pourriez-vous expliquer comment se déroule le flux des messages? L'utilisateur est-il la personne dans un atelier de réparation et saisit les détails de l'accident dans un formulaire http, puis envoie les données au serveur. Cela crée-t-il un message géré par akka? Que faire de ce message? Extraire les informations saisies pour interroger la base de données, puis mettre la réponse en file d'attente pour la renvoyer au web-frontend?
surfmuggle

24

Vous pouvez utiliser Akka pour plusieurs types de choses.

Je travaillais sur un site Web, où j'ai migré la pile technologique vers Scala et Akka. Nous l'avons utilisé pour à peu près tout ce qui s'est passé sur le site Web. Même si vous pensez qu'un exemple de chat est mauvais, tous sont fondamentalement les mêmes:

  • Mises à jour en direct sur le site Web (par exemple vues, likes, ...)
  • Affichage des commentaires des utilisateurs en direct
  • Services de notification
  • Recherche et tous autres types de services

En particulier, les mises à jour en direct sont faciles car elles se résument à ce qu'est un exemple de chat. La partie services est un autre sujet intéressant car vous pouvez simplement choisir d'utiliser des acteurs distants et même si votre application n'est pas en cluster, vous pouvez la déployer facilement sur différentes machines.

J'utilise également Akka pour une application de routage automatique de PCB avec l'idée de pouvoir passer d'un ordinateur portable à un centre de données. Plus vous lui donnez de puissance, meilleur sera le résultat. Ceci est extrêmement difficile à implémenter si vous essayez d'utiliser la simultanéité habituelle car Akka vous offre également une transparence de localisation.

Actuellement en tant que projet de temps libre, je construis un framework web utilisant uniquement des acteurs. Encore une fois, les avantages sont l'évolutivité d'une seule machine à un cluster entier de machines. De plus, l'utilisation d'une approche basée sur les messages rend votre service logiciel orienté dès le départ. Vous avez tous ces jolis composants, qui se parlent mais ne se connaissent pas nécessairement, vivent sur la même machine, pas même dans le même centre de données.

Et depuis la fermeture de Google Reader, j'ai commencé avec un lecteur RSS, en utilisant bien sûr Akka. Il s'agit pour moi de services encapsulés. En conclusion: le modèle d'acteur lui-même est ce que vous devez d'abord adopter et Akka est un cadre très fiable qui vous aide à le mettre en œuvre avec de nombreux avantages que vous recevrez en cours de route.


Bonjour Joe, pourriez-vous expliquer comment les messages sont utilisés pour mettre à jour le site? Avez-vous un système pour l'auteur du contenu; il crée un nouvel article et clique sur enregistrer. Cela crée-t-il un message envoyé à plusieurs serveurs qui gèrent le trafic entrant. Chaque serveur traite le message de mise à jour dès qu'il le peut. Chaque nouvelle demande de navigateur obtient alors une version mise à jour de la page? Merci
surfmuggle

18

Nous utilisons akka avec son plugin camel pour distribuer notre analyse et notre traitement des tendances pour twimpact.com . Nous devons traiter entre 50 et 1000 messages par seconde. En plus du traitement multi-nœuds avec chameau, il est également utilisé pour distribuer le travail sur un seul processeur à plusieurs travailleurs pour des performances maximales. Fonctionne assez bien, mais nécessite une certaine compréhension de la façon de gérer les congestions.


utilisez-vous également la tolérance aux pannes d'Akka?
Erik Kaplun

Que diriez-vous de Spark Streaming si nous vous avons accès au cluster Spark?
skjagini

18

J'essayais mes mains sur Akka (Java api). J'ai essayé de comparer le modèle de concurrence basé sur les acteurs d'Akka avec celui du modèle de concurrence Java simple (classes java.util.concurrent).

Le cas d'utilisation était une simple carte canonique réduisant la mise en œuvre du nombre de caractères. L'ensemble de données était une collection de chaînes générées de façon aléatoire (400 caractères de long) et calculait le nombre de voyelles qu'elles contiennent.

Pour Akka, j'ai utilisé un BalancedDispatcher (pour l'équilibrage de charge entre les threads) et RoundRobinRouter (pour garder une limite sur mes acteurs de fonction). Pour Java, j'ai utilisé une technique de jonction de fourche simple (mise en œuvre sans aucun algorithme de vol de travail) qui permettrait de mapper / réduire les exécutions et de joindre les résultats. Des résultats intermédiaires ont été conservés dans les files d'attente de blocage pour rendre même la jonction aussi parallèle que possible. Probablement, si je ne me trompe pas, cela imiterait en quelque sorte le concept de "boîte aux lettres" des acteurs Akka, où ils reçoivent des messages.

Observation: Jusqu'à des charges moyennes (~ 50000 entrée de chaîne), les résultats étaient comparables, variant légèrement selon les différentes itérations. Cependant, comme j'augmentais ma charge à ~ 100 000, cela bloquait la solution Java. J'ai configuré la solution Java avec 20-30 threads dans cette condition et elle a échoué dans toutes les itérations.

L'augmentation de la charge à 1000000 a également été fatale pour Akka. Je peux partager le code avec toute personne intéressée pour avoir une contre-vérification.

Donc pour moi, il semble qu'Akka évolue mieux que la solution multithread Java traditionnelle. Et probablement la raison en est la magie sous le capot de Scala.

Si je peux modéliser un domaine problématique comme un message événementiel en passant, je pense que Akka est un bon choix pour la JVM.

Test effectué sur: Version Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bits. 3 Go de RAM. Processeur Intel Core i5, vitesse d'horloge de 2,5 GHz

Veuillez noter que le domaine problématique utilisé pour le test peut être débattu et j'ai essayé d'être aussi juste que mes connaissances Java le permettaient :-)


3
"Je peux partager le code avec toute personne intéressée pour avoir une contre-vérification." J'aimerais si cela ne vous dérange pas.
n1r3

3
J'aimerais aussi le code, pouvez-vous poster un lien github?
Gautam

Merci pour ton intérêt. Malheureusement, j'ai des problèmes pour mettre en place un dépôt github. Si vous pouvez me donner vos e-mails, je peux envoyer un mail via le code source. Et regrette une réponse tardive!
sutanu dalui

@sutanudalui Avez-vous toujours le code s'il vous plaît, si c'est le cas, je peux partager mon e-mail?
Jay

16

Nous utilisons Akka dans les systèmes de dialogue parlé ( primetalk ). En interne et en externe. Afin d'exécuter simultanément un grand nombre de canaux de téléphonie sur un seul nœud de cluster, il est évidemment nécessaire d'avoir un cadre multithreading. Akka fonctionne tout simplement parfait. Nous avons fait un cauchemar avec la java-simultané. Et avec Akka, c'est comme une balançoire - cela fonctionne simplement. Robuste et fiable. 24 * 7, non-stop.

À l'intérieur d'un canal, nous avons un flux d'événements en temps réel qui sont traités en parallèle. En particulier: - longue reconnaissance automatique de la parole - se fait avec un acteur; - producteur de sortie audio qui mélange quelques sources audio (y compris la parole synthétisée); - la conversion de texte en parole est un ensemble distinct d'acteurs partagés entre les canaux; - traitement sémantique et connaissance.

Pour effectuer des interconnexions de traitement de signaux complexes, nous utilisons SynapseGrid . Il présente l'avantage de la vérification à la compilation du DataFlow dans les systèmes d'acteurs complexes.


14

J'ai récemment implémenté l'exemple canonique de réduction de carte dans Akka: Word count. C'est donc un cas d'utilisation d'Akka: de meilleures performances. C'était plus une expérience des acteurs de JRuby et d'Akka qu'autre chose, mais cela montre également que Akka n'est pas seulement Scala ou Java: il fonctionne sur toutes les langues en plus de JVM.


Savez-vous ce qui est responsable d'une meilleure performance (et aussi par rapport à quelle alternative)? Est-ce dû à l'utilisation de JRuby sur JVM (vs Ruby natif), à la scalalibiliy due à des E / S non bloquantes ou à autre chose?
StaxMan

2
La comparaison que j'ai écrite était: Jruby séquentiel VS Jruby avec des acteurs. Par conséquent, la seule chose qui peut être responsable d'une exécution plus rapide est la participation des acteurs. Aucune E / S n'a participé aux expériences (un fichier est chargé à partir du disque, mais cela est fait avant que la minuterie de référence ne soit définie).
Daniel Ribeiro

J'ai récemment implémenté un exemple de réduction de carte, mais c'est tout simplement de la vanille java github.com/chaostheory/jibenakka
chaostheory
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.