BT

Netflix présente Hollow, une bibliothèque Java pour le traitement des jeux de données en mémoire

| par Michael Redlich Suivre 15 Abonnés , traduit par Nicolas Frankel Suivre 7 Abonnés le 07 févr. 2017. Durée de lecture estimée: 4 minutes |

Netflix a récemment introduit Hollow, une bibliothèque Java et une boîte à outils conçue pour stocker efficacement des ensembles de données qui ne sont pas caractérisées comme du "big data". Ces ensembles de données peuvent être des méta-données pour les moteurs de recherche et de commerce électronique ou dans le cadre de Netflix, des méta-données à propos de films et d'émissions télévisées. Les solutions traditionnelles pour le traitement de ces ensembles de données comprennent l'utilisation d'un magasin de données ou la sérialisation mais souffrent généralement de problèmes de fiabilité et de latence. Le guide de démarrage de Hollow résume les concepts de base et la nomenclature :

Hollow gère des ensembles de données construits par un producteur unique et diffusés à un ou plusieurs consommateurs pour un accès en lecture seule. Un jeu de données change avec le temps. La chronologie d'un jeu de données peut être divisée en états de données distincts, chacun d'entre eux étant un instantané intégral des données à un instant donné.

Le producteur et les consommateurs manipulent les jeux de données via un moteur à états qui effectue des transitions entre les états de données. Un producteur utilise un moteur à états d'écriture et un consommateur un moteur à états de lecture.

Hollow remplace l'ancien framework de jeux de données en mémoire de Netflix, Zeno. Les jeux de données sont maintenant représentés par un encodage des données compact, de longueur fixe et fortement typé. Cet encodage minimise l'empreinte d'un jeu de données et les enregistrements codés sont "emballés dans des blocs de mémoire réutilisables qui sont regroupés sur le tas de la JVM pour éviter d'affecter le comportement du ramasse-miettes sur les serveurs occupés".

Pour démarrer

Pour démarrer avec un exemple d'Hollow, considérez le POJO suivant :

   
public class Movie {
    long id;
    String title;
    int releaseYear;

    public Movie(long id,String title,int releaseYear) {
        this.id = id;
        this.title = title;
        this.releaseYear = releaseYear;
        }
    }
    

Un jeu de données simple basé sur le POJO ci-dessus peut être peuplé ainsi :

List<Movie> movies = Arrays.asList(
    new Movie(1,"The Matrix",1999),
    new Movie(2,"Beasts of No Nation",2015),
    new Movie(3,"Goodfellas",1990),
    new Movie(4,"Inception",2010)
    );

Hollow traduit cette liste de movies en une nouvelle disposition d'encodage comme illustré ci-dessous :

Vous trouverez plus de détails sur cet encodage dans la section sujets avancés du site web de Hollow.

Le producteur

La première instance d'un producteur publie un état de données initial d'un jeu de données (movies dans cet exemple) et les consommateurs sont informés de l'endroit où localiser celui-ci. Les changements ultérieurs apportés au jeu de données sont systématiquement publiés et communiqués aux consommateurs.

Un producteur utilise un HollowWriteStateEngine comme référence pour un jeu de données :

HollowWriteStateEngine writeEngine = new HollowWriteStateEngine();

Un HollowObjectMapper peuple un HollowWriteStateEngine :

HollowObjectMapper objectMapper = new HollowObjectMapper(writeEngine);
for(Movie movie : movies) {
    objectMapper.addObject(movie);
    }

Le HollowObjectMapper est thread-safe et peut également être exécuté en parallèle.

Le producteur écrit le jeu de données (également appelé blob) sur un flux de sortie spécifique :

OutputStream os = new BufferedOutputStream(new FileOutputStream(snapshotFile));
HollowBlobWriter writer = new HollowBlobWriter(writeEngine);
writer.writeSnapshot(os);

Génération d'une API pour les consommateurs

Une API client génère les fichiers Java nécessaires basés sur le modèle de données et doit être exécutée avant d'écrire le code source du consommateur initial :

HollowAPIGenerator codeGenerator = new HollowAPIGenerator(
    "MovieAPI", // a name for the API
    "org.redlich.hollow.consumer.api.generated", // the path for generated API files
    stateEngine); // the state engine
codeGenerator.generateFiles(apiCodeFolder);
    

 

Le consommateur

Une fois le consommateur avisé qu'un ensemble de données est publié, le consommateur utilise un HollowWriteReadEngine comme référence pour un jeu de données :

HollowReadStateEngine readEngine = new HollowReadStateEngine();

Un HollowBlobReader consomme un blob du producteur dans un HollowReadStateEngine :

HollowBlobReader reader = new HollowBlobReader(readEngine);
InputStream is = new BufferedInputStream(new FileInputStream(snapshotFile));
reader.readSnapshot(is);

Les données du jeu de données peuvent être accédées via l'API générée :

MovieAPI movieAPI = consumer.getAPI();
for(MovieHollow movie : movieAPI.getAllMovieHollow()) {
    System.out.println(movie._getId() + ", " +
    movie._getTitle()._getValue() + ", " +
    movie._getReleaseYear());
    }
    

Ceci affichera le résultat suivant :

1, "The Matrix", 1999
2, "Beasts of No Nation", 2015
3, "Goodfellas", 1990
4,"Inception", 2010

L'intégralité du projet Hollow est disponible sur Github.

InfoQ a récemment présenté une entrevue détaillée avec Drew Koszewnik, ingénieur logiciel senior chez Netflix et contributeur principal de Hollow, concernant les détails d'implémentation spécifiques d'Hollow.

Evaluer cet article

Pertinence
Style

Bonjour étranger!

Vous devez créer un compte InfoQ ou cliquez sur pour déposer des commentaires. Mais il y a bien d'autres avantages à s'enregistrer.

Tirez le meilleur d'InfoQ

Donnez-nous votre avis

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet
Commentaires de la Communauté

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet

Html autorisé: a,b,br,blockquote,i,li,pre,u,ul,p

M'envoyer un email pour toute réponse à l'un de mes messages dans ce sujet

Discuter

Se connecter à InfoQ pour interagir sur ce qui vous importe le plus.


Récupérer votre mot de passe

Follow

Suivre vos sujets et éditeurs favoris

Bref aperçu des points saillants de l'industrie et sur le site.

Like

More signal, less noise

Créez votre propre flux en choisissant les sujets que vous souhaitez lire et les éditeurs dont vous désirez suivre les nouvelles.

Notifications

Restez à jour

Paramétrez vos notifications et ne ratez pas le contenu qui vous importe

BT