30 votes

Dans le réacteur du projet ou les ruisseaux akka, quelle est la différence conceptuelle entre l'évier et l'abonné?

Les concepts d'évier et d'abonné me semblent similaires. De plus, je ne vois pas le concept de récepteur être explicitement défini dans la spécification des flux réactifs.

78voto

Je vois que Oleh Dokuka, à partir du Projet de Réacteur (manquants avertissement-il), posté une réponse déjà, cependant une grande partie de ses hypothèses sur Akka Flux et Flux de Réactif incorrecte, alors permettez-moi de préciser ci-dessous.

Avertissement: j'ai participé à Réactif Flux puisque c'est le début de jours, et l'auteur de la plupart de ses Technologies Kit de Compatibilité. J'ai aussi maintenir Akka Akka et les Ruisseaux.

Notez également que: Les Flux ont été inclus dans Java 9, et sont connus comme java.util.de façon concomitante.L'écoulement.* donc tous les commentaires ci-dessous concernant la RS stand exactement de la même manière à propos de j.u.c.Flow.Subscriber et les autres types.


La réponse

Réactif de Flux est un Prestataire de Service d'Interface (SPI) Spécification

Réactif cours d'eau, et plus précisément de l'Éditeur / Abonné / Abonnement / types de Processeur, sont un Fournisseur de Service d'Interface. C'est confirmé, même dans les premières discussions sur la spécification datant de 2014.

Dans les premiers jours de la même spécification la spécification de types a tenté de cacher l'Éditeur, l'Abonné et les autres types. Malheureusement les types serait fuite indépendamment dans le dos alors considéré comme de l'API, ainsi que l'API(!) a été supprimé et le SPI types sont tout ce qui reste.

Aujourd'hui, vous voyez que certaines implémentations de Réactif Flux de prétendre que leur direct l'extension de ces types est un avantage pour certaines raisons. Ce n'est pas correct, en tant que tel n'a pas été, et n'est pas le but de la Réactif Flux d'interfaces. C'est plutôt une incompréhension de ce que ces types sont-strictement inter-op interfaces Réactives Flux de bibliothèques d'accord à comprendre et à "parler" (un protocole).

Pour référence, RxJava 2.0 ainsi que des Réacteurs de faire directement étendent ces types, tout en Akka Flux reste fidèle à la RS est la conception et les principes en se cachant comme un développeur de l'application l'interface de programmation, d'où l'importance de l'Évier ne s'étend pas Abonné. Cela n'a rien à voir avec la "prise en charge native" comment j'ai vu des gens se demande directe de la relation " EST-UN est (plutôt, revendiquant un inter-op de la librairie de votre "native" est une mauvaise compréhension du concept).

Les éviers et les Abonnés, les Sources et les Éditeurs

Les concepts de l'évier et de l'abonné sembler similaire à moi.

Corriger, ils sont, sur le but et par la conception, la similaires.

Un récepteur est une levée de représentation de quelque chose qui effectivement donne un Abonné. Pour simplifier, vous pouvez la considérer comme une "fabrique d'Abonné" (plus précisément, l'Évier est le "plan d'action", et le Materializer prend l'évier, le plan et crée approprié RS stades, y compris les Éditeurs pour les Sources et les Abonnés pour les Éviers. Donc quand vous dites que l'Évier.l'ignorer est en fait une usine qui sera à la fin de la création d'un Abonné qui fait tout le requérant et ignorant que, selon les Flux de Réactif. La même chose avec toutes les autres méthodes déclarées sur l'Évier.

La même chose s'applique Source, ce qui porte à 1:1 d'un Réactif Ruisseaux Publisher. Ainsi, un Source.single(1) est quelque chose qui va à l'interne se concrétiser dans un Publisher qui fait du travail - n'émet que 1 élément s'il est autorisé à le faire par l'aval.

A. K. A. Pourquoi il n'y a pas de Lavabo dans les Flux de Réactif?

Comme mentionné ci-dessus, Akka d'Évier de ne pas étendre directement à un Abonné. Il est toutefois essentiellement d'une usine pour eux.

Vous pouvez vous demander: "est-ce à l'utilisateur de ne jamais voir ces éditeurs/types d'Abonnés à tous bien que lors de l'utilisation normale?" Et la réponse est: oui en effet, et c'est une caractéristique de la conception de l'objectif (en accord avec ce Réactif Flux est). Si le sous-jacent de l'Éditeur et l'Abonné cas ont été exposés à des utilisateurs de tous les temps directement, on peut les appeler de manière incorrecte provoquant des bugs et de la confusion. Si ces types ne sont jamais exposés à moins d'être expressément demandé, il y a moins de chances accidentelle des erreurs!

Certains ont mal compris que le design, et a affirmé qu'il n'y a pas de support "natif" dans Akka cours d'eau (ce qui n'est pas vrai). Nous allons voir à travers ce qu'être détaché de l'Abonné dans le cadre de l'API nous gagne:

Aussi, je ne vois pas le concept de l'évier soit explicitement définie dans le réactif de flux spec.

En effet, les Éviers ne sont pas une partie de Réactif de Flux, et c'est absolument parfait.

Les avantages d'éviter le "Piège" EST-UN Abonné"

Sinks font partie de Akka cours d'eau, et leur but est de fournir le fluide DSL, ainsi que les usines Subscribers. En d'autres termes, si l'Abonné est les blocs de LEGO, Sink est ce qui les renforce (et Akka Stream Materializer est ce qui met les différents blocs de LEGO ensemble dans la commande "exécuter" entre eux).

En fait, il est bénéfique pour les utilisateurs que l'Évier ne portent pas le définitif EST-UN avec un Abonné (sic!) à l'instar d'autres bibliothèques:

C'est parce que depuis org.reactivestreams.Subscriber a maintenant été inclus dans Java 9, et est devenu une partie de Java lui-même, les bibliothèques devraient migrer à l'aide de l' java.util.concurrent.Flow.Subscriber au lieu de org.reactivestreams.Subscriber. Les bibliothèques qui ont choisi d'exposer et d'étendre directement le Réactif de Flux de types ont maintenant un plus en plus de mal à s'adapter à la JDK9 types -- toutes leurs classes qui étendent l'Abonné et ses amis devront être copiés ou modifiés pour étendre la même interface, mais à partir d'un package différent. Dans Akka nous simplement exposer le nouveau type lorsqu'on a demandé à -- déjà du soutien JDK9 types, à partir du jour JDK9 a été libéré.

Avec des Flux de Réactif étant un SPI -- un Fournisseur de Service d'Interface -- il est prévu pour les bibliothèques de partager ce qu'ils peuvent "parler le même type et le protocole". Toutes les communications qui Akka Ruisseaux faire, et d'autres Réactifs Flux de bibliothèques, de respecter ces règles, et si vous voulez connecter une autre bibliothèque à Akka Flux, vous feriez juste que-donner Akka Flux inter-op de type, qui est l'Abonné, le Processeur, ou de l'Éditeur; pas de l'Évier, car c'est la Akka du "Akka" spécifiques à un DSL (domain specific language), ce qui ajoute de la commodité et autres subtilités sur le dessus de cela, se cacher (sur le but!) le type d'Abonné.

Une autre raison Akka (et pour être honnête autres RS implémentations ont été encouragés à le faire, mais a choisi de ne pas le faire) les peaux de ces types est parce qu'ils sont faciles à faire quelque chose de mal avec. Si vous faites passer un Abonné quelqu'un pourrait appeler les choses sur elle, et même de l'onu-qui enfreignent sciemment les règles et les garanties que le Réactif de Flux de Spécification exige de toute personne en interaction avec le type.

Afin d'éviter les erreurs de se produire, le Réactif de Flux de types de Akka, les Flux sont "cachés" et seulement exposés lorsqu'il est explicitement demandé ce qui permet de minimiser le risque de faire des erreurs par inadvertance d'appel de méthodes sur "raw" Réactif de Flux sans suite de leur protocole.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X