Série Elasticsearch

Publié par Fabrice Michellonet sous le(s) label(s) , , , le 23 décembre 2014

Ce post fait office de sommaire à toute une série d’articles que j’ai bon espoir d’écrire sur cette toute fin d’année 2014 et le début 2015.

Mais pourquoi parler d’Elasticsearch, moi qui ne traite que de technos Microsoft sur ce blog?

Cela part du constat qu’a mon humble avis, la stack BI Microsoft pèche sur deux points :

  • Premièrement, il n’existe pas d’outils permettant une exploration décente des données non encore nettoyées, rangées, retraitées etc.… d’ailleurs, plus la volumétrie est importante et plus ce point est difficilement adressable.
    (i.e : sur de petites volumétries, j’en entends déjà me dire qu’Excel peut avoir ce rôle, avec un enchevêtrement de tableaux croisés dynamiques etc… )
  • L’outillage de reporting est assez pauvre et n’est vraiment pas penser pour être à destination des fonctionnels.
    Je m’explique Reporting Services fait le job lorsqu’il s’agit de réaliser un document pro format, mais nécessite des compétences techniques que nos fonctionnels ne disposent pas ; et c’est bien normal.
    Vous aurez probablement également entendu parler de la version « User Friendly » de « Reporting Services », j’ai nommé Report Builder. La tentative est louable, mais le résultat n’est pas la à hauteur.
    Encore une fois dans les faits, bien peut de fonctionnels ont les connaissances, l’envie et le temps de l’utiliser.

C’est avec ces regrets dans l’âme, que je me retrouve lors de la conférence ncraft 2014 à assister à une superbe session d’Itamar Syn-Hershko consacrée au couple Elasticsearch et Kibana.

Je vous passe les détails de cette présentation, mais effet whaou garanti vers la fin de la session lorsque Kibana rentre en scène.

Certain doivent se dire qu’il m’a fallu presque 1 an pour commencer à sortir un article, quelle productivité !

Pour être tout à fait franc, il y a 1 an il manquait encore quelques features indispensable a mon sens pour que Kibana puisse jouer un rôle aussi important que ce pour quoi il à été conçu. L’exemple le plus probant était l’impossibilité de réaliser un « distinc count » ; un « show stopper » pour qui compte faire un peu de BI sérieusement.

Voila pour le petit historique et mes états d’âmes ; Kibana est arrivé à maturité selon moi dans ses cas d’utilisation standard et cela mérité bien qu’on s’y intéresse ainsi qu’a l’écosystème qui gravite autour.

Voici enfin l’heure du menu :

  • 1ere Partie : Explorez vos données avec Kibana
  • 2eme Partie : Chargez vos données, les yeux fermés avec Logstash
  • 3eme Partie : Introduction à Elasticsearch
  • 4eme Partie : Changement de mapping et Reindexation
  • 5eme Partie : Reporting avancé & Dashbording (Kibana)
  • 6eme Partie : Transformation de données (Logstash)

Il y’a de forte chance que ce sommaire soit agrémenté d’autres articles dans le futur ; le domaine étant extrêmement large.

Dernier point, l’ordre des premiers articles peut vous paraître étrange ; j’ai voulu partir de ce qui apportera le plus de valeur ajouté aux fonctionnels pour finir par ce qui requiers le plus de compétences techniques.

Il ne me reste qu'a vous souhaiter une bonne lecture, et n'hésitez pas a me laisser vos commentaires.

Utiliser Couchbase comme serveur de cache

Publié par Fabrice Michellonet sous le(s) label(s) , , le 11 avril 2014

Dernièrement, je vous présentais une façon simple d'utiliser le cache dans vos applications .NET
Cependant cette solution possède plusieurs inconvénients. En voici quelque uns :

  • Le cache est lié au processus système de votre application (executable / IIS etc...). Si votre programme plante ou est fermé, vous perdez votre cache
  • Si vos besoins en mémoire augmentent, cette solution n'est pas scalable
  • Rien n'est mis a disposition pour monitorer votre cache
  • Vous n'avez pas d'interface de gestion du cache (augmentation de la mémoire allouée etc...)
  • Vous ne pouvez pas invalider le cache sans arrêter l'application.
  • etc...
Bref, vous avez compris, c'est une solution pour démarrer petit.

Aujourd'hui, je voudrais partager avec vous une solution qui répond à tous les manques évoqués plus haut et plus encore.
Couchbase est une base NoSQL Key/Value; la value ayant comme particularité d'être un document json.
Couchbase est issu du mariage heureux de Membase (cache mémoire avec réplication des caches, persistance et interface d’admin Web sexy) et
CouchDB (NoSQL orienté document). Ce qui nous intéresse plus particulièrement aujourd'hui sont les fonctionnalités qui en font un bon serveur de cache.


Installation


Pour l'installer, tout commence par télécharger le setup ici

Je vous passe le scénario d'installation qui a le bon gout de se faire en "Next" > "Next" > "Next"

Passons à la configuration :

Dans la première étape, il vous faudra spécifier l'emplacement des fichiers (base et index) ainsi que la mémoire dévolue à Couchbase.

configure server

Un peu plus loin nous allons créer le l'espace qui accueillera les objets que l'on va mettre en cache (bucket).

bucket

Quelques instant plus tard vous voila avec un Couchbase flambant neuf sur votre machine.

up and running

Note : si la page ne s'ouvre pas automatiquement dans votre browser, la console d'admin de couchbase se trouve a l'adresse suivante : http://localhost:8091/


Implementation


Couchbase dispose d'un très bel écosystème qui gravite autour, et la plateforme .NET ne fait pas exception.
Je me propose d'adapter le cache manager vu dans le précédent article.
Pour rappel nous avions l'interface suivante :


public interface ICacheManager
{
    T GetOrInsert<T>(string key, Func<T> callback) where T : class;
}

Passons à l'implémentation. Il va nous falloir un driver, que l'on peut aisément installer via nuget :



son utilisation est des plus simple, avec des méthodes explicites comme Get() et Store().
Voici une implémentation de cache respectant notre interface basée sur Couchbase.


public class CouchbaseCacheManager : ICacheManager
    {

        private readonly CouchbaseClient _client;

        public CouchebaseCacheManager()
        {
            _client = new CouchbaseClient();
        }

        public T GetOrInsert<T>(string key, Func<T> callback) where T : class
        {
            T elmnt;
            try
            {
                if (_client.KeyExists(key))
                    return _client.Get<T>(key);
                elmnt = callback();
                _client.Store(StoreMode.Add, key, elmnt);
            }
            catch (Exception)
            {
                elmnt = callback();
            }
            return elmnt;
        }
    }

Et vous, quel type de cache utilisez vous dans vos projets?

Poor man's cache

Publié par Fabrice Michellonet sous le(s) label(s) , , le 4 avril 2014

Depuis la version 4 du framework .NET, la gestion d'un cache est profondement encrée dans l'adn de notre framework.
Il devient alors extrêmement facile de stocker en mémoire à peu près n'importe quoi.
Je vous livre dans ce court billet, une implémentation extrêmement simple que j'utilise souvent dans mes projets.
Commençons par définir une interface, qui nous permettra d'injecter notre cache manager un peu partout :

public interface ICacheManager
{
    T GetOrInsert<T>(string key, Func<T> callback) where T : class;
}

et finalement voici une implémentation extra simple de notre cache manager

public class CacheManager : ICacheManager
{
    public T GetOrInsert<T>(string key, Func<T> callback) where T : class
    {
        ObjectCache cache = MemoryCache.Default;
        if (cache.Contains(key))
            return cache[key] as T;
        T elmnt = callback();
        cache.Add(new CacheItem(key, elmnt), new CacheItemPolicy());
        return elmnt;
    }
}

Voici un exemple d'utilisation.

IEnumerable<Product> products = _cache.GetOrInsert("Ma_Clef_Unique_Cache", 
() => { return _productService.GetFrenchProducts(); } );

Simple non?

IISExpress : Servir des pages vers l’extérieur.

Publié par Fabrice Michellonet sous le(s) label(s) , le 28 mars 2014

Nul doute, IISExpress nous a simplifié la vie au quotidien de par sa facilité d'utilisation et son intégration à Visual Studio.
Aujourd'hui, je devais travailler à rendre un site compatible avec l'ipad. Ni une ni deux, je lance safari et pointe vers l'ip de ma machine de dev.
Et boom une belle erreur, me prévient que IISExpress ne servira de pages qu'en local.

Voici comment je l'ai configuré afin de pouvoir tester sur mon Ipad.

1 - Configurons notre site web afin qu'il soit bindé sur toutes les IP de notre machine de dev.

Pour ce faire ouvrons le fichier de config de IISExpress qui se trouve sur : %userprofile%\My Documents\IISExpress\config\applicationhost.config
Recherchons la config de notre site


<site name="MonSite" id="10">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\!Project\MonSite" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:44300:localhost" />
</bindings>
</site>

remplaçons le binding afin que le site soit servi quelque soit l'ip sur laquelle arrive la requete


<site name="MonSite" id="10">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\!Project\MonSite" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:44300:*" />
</bindings>
</site>

2 - Réservons l'url au niveau du kernel (HTTP.sys)

Cela se fait via la ligne de commande suivante, a executée dans une console en mode admin.


netsh http add urlacl url=https://*:44300/ user=everyone

Note : pour ceux qui travaillent sur un windows en français il faudra alors taper


netsh http add urlacl url=https://*:44300/ user="tout le monde"


3 - Autoriser le trafic au travers du firewall

De nouveau une commande à exécuter via une console en mode admin :


netsh firewall add portopening TCP 44300 IISExpressWeb enable ALL


Voila, j'espère que cette astuce pourra vous éviter de rester coincé si vous devez exposer un site hebergé sur votre machine de dev

EntityFramework.Patterns 0.8 est compatible EF 6

Publié par Fabrice Michellonet sous le(s) label(s) , , , le 17 novembre 2013

Ça faisait longtemps que je n'avais pas remis les mains dans ce projet, plus d'un an pour être exact. Le passage à Entity Framework 5 n'avait pas posé de soucis car aucun breaking changes dans l'API n'avait bloqué l'utilisation de la librairie. C'est surement ce qui explique le nombre "plutôt important" (7500) download sur nuget gallery.

Mais avec EF 6 c'est une autre histoire, tout un tas de nouvelles fonctionnalités très sympa, mais aussi une api qui a pas mal bougé... ainsi plusieurs utilisateurs sur codeplex, m'ont tout naturellement contacté pour me demander de mettre à jour EntityFramework.Patterns.

C'est chose faite, la version 0.8 est désormais disponible via nuget ou sous forme binaire et est compatible avec la dernière version d'EF

Ça signifie que mes chers utilisateurs vont pouvoir profiter des gains de performances apportées par EF 6; Quant au projet sur lequel je travaille actuellement, j'espère bien upgrader EF dès demain... Romain, si tu m'entends :p

Dans un avenir proche, je pense ajouter un bout d'API asynchrone aux repository d'EntityFramework.Patterns.

Bon upgrade de package !!