BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

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

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

Favoris

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

Contenu Éducatif

BT