Skip to content

Methods & Tools

Le blog d'OCTO Technology, cabinet d'architectes en systĂšmes d'information
Syndiquer le contenu
Le blog d'OCTO Technology, cabinet d'architectes en systĂšmes d'information
Mis à jour : il y a 2 heures 22 min

CR du petit-dĂ©jeuner OCTO « Tablettes : passons Ă  l’ùre post PC »

ven, 02/03/2012 - 14:46

Agenda :

  • Rappel de l’offre mobilitĂ© OCTO
  • Les tablettes : quels usages pour quels enjeux ?
  • Les tablettes : quels impacts sur le SI ?
  • Table ronde : retours d’expĂ©rience d’Arval, Corsairfly, Axa et BNP Paribas Fortis
  • Questions/rĂ©ponses

Rappel de l’offre mobilitĂ© OCTO :

OCTO travaille sur la mobilitĂ© depuis 3 ans avec une Ă©quipe capable d’adresser les projets de l’idĂ©e au store (ergonomes, designers, dĂ©veloppeurs, experts, architectes) qui permet d’accompagner au mieux ses clients.

OCTO met le focus sur deux types d’activitĂ©s :

  • Le conseil (rĂ©flĂ©chir Ă  l’évolution du SI des clients : quelle stratĂ©gie mobile ? pour quels usages ? quelle cible ? quels terminaux ? quels impacts sur le SI ?…)
  • La rĂ©alisation (les applications sont rĂ©alisĂ©es de bout en bout soit « clĂ© en main », soit en corĂ©alisation avec nos  clients ; et un rĂ©el travail sur l’intĂ©gration de ces applications dans le SI est menĂ© (questions autour de la performance, comment sĂ©curiser l’application, la distribuer ?…)

En complĂ©ment, OCTO propose Ă  ses clients une solution pour distribuer leurs applications en interne, sous forme d’un store privĂ© sur le Cloud : Appaloosa (lien).

Les tablettes : quels usages pour quels enjeux ?

Il s’est vendu cette annĂ©e plus de tablettes (1,45 millions) que de PC de bureau (1,24 millions) pour les particuliers. 2012 laisse prĂ©sager 3 millions de tablettes vendues, donc de se rapprocher des ventes de portables (4 millions en 2011)

Pourquoi cet engouement et notamment par les usagers en entreprise ?

Les tablettes présentent de nombreux avantages :

  • Taille : – de 1kg ; -1 cm d’épaisseur donc faciles Ă  emporter partout avec soi pour une rĂ©union, un briefing, …
  • PraticitĂ© (facilement ouvertes, immĂ©diatement allumĂ©es, ergonomiques et intuitives)
  • Autonomie de 10h
  • Prix attractif (– de 500€ neuf et 350€ / an) c’est moins cher pour une entreprise qu’un PC portable
  • ConnectivitĂ© au rĂ©seau : 49% des tablettes sont Ă©quipĂ©es du wifi et de la 3G et peuvent donc ĂȘtre connectĂ©es en permanence avec le SI
  • GĂ©o localisation (utile pour les commerciaux par exemple : quels sont mes clients proximité ?)
  • StabilitĂ© des produits, soit moins d’activitĂ© de formation et de help desk

En moyenne les utilisateurs utilisent une tablette plus de 90 minutes quotidiennement : dans le salon le soir, le matin au petit-dĂ©jeuner, lors de temps d’attente ou avant de dormir. Ce sont des moments privilĂ©giĂ©s pour capter l’attention de l’utilisateur.

L’utilisateur type de la tablette est un homme, d’environ 35 ans, aisĂ© et plutĂŽt geek.

Un support qui capte l’attention, un utilisateur aisĂ©, c’est une excellente opportunitĂ© pour capter le consommateur et pour diffuser ses services en B2C. Ainsi, en quelques mois la SNCF a Ă©coulĂ© plus de 100 000 billets par le biais de son application iPad, en valeur c’est 15% de ses ventes sur applications mobiles.

Le marché des particuliers est donc lancé mais on assiste également à une véritable percée sur le marché professionnel :

  • 60% des utilisateurs de tablette l’utilisent sur leur lieu de travail
  • pour 24% d’entre eux, les iPad sont fournis en entreprise
  • et 14% n’utilisent plus leur PC

En effet le PC fait « écran » entre l’utilisateur et les autres, alors que l’on ne peut pas cacher derriĂšre une tablette. Elle redĂ©finit les contours des usages en entreprise : elle devient un outil propice au partage, Ă  la collaboration lĂ  oĂč le PC se cantonne dĂ©sormais Ă  un outil personnel d’analyse, de rĂ©flexion et de production.

Quelques exemples d’utilisation en contexte professionnel :

  • La borne interactive CLINIQUE pour les vendeuses : pĂ©dagogie avec le client, renforcement de l’engagement du client par rapport Ă  la marque, collecte de donnĂ©es (ex : recommandations faites en magasin
)
  • Remplacement des caisses traditionnelles par des tablettes (aux US).
  • Impact dans le secteur mĂ©dical Ă©galement : visites prĂ©/post opĂ©ratoires facilitĂ©es (informations sur le patient, visualisation des IRM, radios
 possibilitĂ© de partager avec le patient sur l’opĂ©ration qui va ĂȘtre menĂ©e
)
  • Les tablettes deviennent utiles dans des contextes de maintenance de rĂ©seaux d’électricitĂ©, de canalisations (tablette facilement transportable, gĂ©olocalisation, facile de checker des problĂšmes, envoi de rapports immĂ©diats
)
  • Indicateurs de pilotage (la plupart ont une application sur les stores)

Pour tous ces usages la connexion au SI est primordiale.

Les tablettes : quels impacts sur le SI ?

La volontĂ© du top management de moderniser les processus mĂ©tiers existants et d’intĂ©grer de nouveaux outils  aura un vĂ©ritable impact sur la conception de nos SI. Regardons ce que changent les tablettes en comparaison des smartphones et des projets sur un PC traditionnel.

Les tablettes sont-elles équivalentes aux smartphones ?

  • Ils sont identiques au point de vue matĂ©riel
  • Pas de nouveautĂ© non plus concernant le dĂ©veloppement d’applications

La rĂ©volution se trouve en fait  dans le type de projets rĂ©alisĂ©s. Le pĂ©rimĂštre mĂ©tier n’est plus aussi restreint qu’avec les smartphones (les Ă©quipes sont plus larges, les durĂ©es de projet plus longues).

Un accent particulier doit ĂȘtre mis sur la qualitĂ©, le design et la conception. Une plus grande libertĂ© est rendue possible grĂące aux Ă©crans plus grands des tablettes ; Ă©crans conçus comme un mashup.

Il existe des  enjeux propres aux tablettes :

  • Un enjeu de montĂ©e en charge (cumul de donnĂ©es)
  • Un enjeu de mise en cache
  • Une attention particuliĂšre doit ĂȘtre portĂ©e sur le fait de ne pas trop multiplier les services proposĂ©s et de les maĂźtriser

En conclusion : on assiste Ă  une montĂ©e en puissance de nouveaux canaux  (webapps HTML5, tablettes, smartphones, demain tĂ©lĂ©s connectĂ©es, rĂ©frigĂ©rateurs
.) et il est impĂ©ratif de garder la maĂźtrise du SI par rapport Ă  tous ces nouveaux besoins.

 Table ronde : retours d’expĂ©rience de Arval, Corsairfly, Axa et BNP Paribas Fortis

  • Question 1 : En quoi consiste le projet ?

Arval : Sébastien Somchit, Head of Interactive Marketing

Le projet a Ă©tĂ© lancĂ© mi 2011 et est parti d’une question posĂ©e : comment amĂ©liorer les relations commerciales ? L’iPad s’est prĂ©sentĂ© comme un Ă©lĂ©ment efficace face aux clients (accĂšs de qualitĂ© Ă  une librairie master de docs rĂ©fĂ©rences, de façon sĂ©curisĂ©e et dans un univers brandĂ© Arval).

Fortis : Yvan Pirenne, Manager Internet & Mobile Banking

L’application easy banking  a pour but la gestion quotidienne sur mobile des opĂ©rations bancaires..

Axa : Guillaume LemĂȘle, Directeur Conseil & Services Distribution Internet & Marketing

L’application a pour but d’aider les commerciaux Ă  la vente d’assurance (ou de banque) sur le terrain : documents facilement Ă  portĂ©e de main, mise en gestion automatique.

Corsairfly : Antoine De Kerviler, DSI

L’application doit rĂ©pondre Ă  un enjeu de reporting pour le personnel navigant. Il fallait 15 Ă  20 jours pour reporter un problĂšme sur un vol. Le but est maintenant de remonter les informations en 24h et de les traiter grĂące Ă  une description catĂ©gorisĂ©e.

  • Question 2 : Pourquoi avez-vous tous choisi l’iPad ?

Fortis : TrÚs bon marketing Apple (affinité au produit) et les critÚres de sécurité !

Arval et Corsairfly : des tests ont Ă©tĂ© menĂ©s et l’iPad a rĂ©pondu aux attentes.

Axa : le parc applicatif est énorme et la communauté de développeurs est trÚs importante.

  •  Question 3 : Quels sont les enjeux de remplacement en interne des PC par les iPad ?

Axa : Ă  terme un remplacement est envisagĂ© (gain de temps et de praticitĂ© en Ă©pargnant sur les papiers, les temps de remplissage, de saisie post remplissage
)

Fortis : un remplacement de processus trÚs lourds est envisagé (photocopies, tris, rangements
)

  • Question 4 : Les clients sont-ils satisfaits ?

Axa : Un plan B papier est toujours envisageable si le commercial se heurte Ă  la rĂ©ticence d’un client. Mais dans l’ensemble ils sont majoritairement ok pour jouer le jeu et franchir le pas du numĂ©rique.

Fortis : ils semblent satisfaits et les gains escomptĂ©s sont Ă  mesurer dans deux types d’action : le conseil et les transactions.

  • Question 5 : Question de la sĂ©curitĂ© des donnĂ©es clients ?

Axa : Les donnĂ©es collectĂ©es ne sont pas gardĂ©es sur l’iPad mais sur le Cloud et un outil de MDM est prĂ©sent pour protĂ©ger ces donnĂ©es.

  • Question 6 : vie privĂ©e/vie public : vous n’avez pas peur que vos salariĂ©s jouent avec ?

Corsairfly : Une libertĂ© assez grande est laissĂ©e aux employĂ©s pour jouer, tester et s’approprier l’iPad mais un focus est fait sur l’importance de respecter la loi et de faire attention aux vols (aĂ©roport, personnel navigant).

  • Question 7 : Si l’on se place d’un point de vue RH, comment est gĂ©rĂ© et perçu l’intĂ©gration de ces outils en interne ?

Arval : l’iPad reste un Ă©lĂ©ment statutaire Ă  ce jour. Tout le monde n’en a pas dans l’entreprise mais ça ne durera surement pas Ă  long terme.

Axa : l’iPad est un Ă©lĂ©ment motivant pour les commerciaux : perçu comme un signe de reconnaissance. Mais c’est un outil dont la valeur est intĂ©grĂ©e Ă  l’entreprise et qui n’est en aucun cas personnel.

  • Question 8 : Question autour de la conduite du changement dans l’entreprise ?

Arval : c’est un projet pilote donc pour le moment les commerciaux sont formĂ©s  Il faudra ensuite s’adapter (question autour du bring your own device, systĂ©matisation
 ?)

Corsairfly : il sera dĂ©montrĂ© individuellement que l’iPad est gĂ©nĂ©rateur de valeur

Fortis : il y aura des changements au niveau rĂ©seau. Les employĂ©s sont les meilleurs ambassadeurs de ce produit (mais il est essentiel de le maĂźtriser avant d’en ĂȘtre capable donc un effort sur la formation doit ĂȘtre fait)

Axa : il y a 4500 commerciaux et tout va tourner autour de l’iPad. Les applications doivent donc ĂȘtre faciles d’utilisation ; permettant ainsi d’éviter des formations longues, nombreuses et coĂ»teuses.

  • Question 9 : Combien coĂ»te un tel projet ?

AXA : plusieurs millions d’euros.

Fortis : Le gros du budget est parti dans couche de services, interaction avec le SI.

Corsairfly : 60K tout compris pour l’application mĂ©tier + 350 € par an de TCO pour l’iPad

  • Question 10 : Quels sont les dĂ©fauts de l’iPad ?

Arval : C’est un outil qui n’est pas conçu Ă  l’origine pour du B2B. Peu de productivitĂ© et de compatibilitĂ© avec Office. On doit adapter les documents Ă  la tablette.

Corsairfly : Les processus d’Apple sont compliquĂ©s : difficile d’avoir un contrat, difficultĂ© liĂ©e au dĂ©ploiement, aux numĂ©ros de carte de crĂ©dit, etc.

Fortis : l’inaccessibilitĂ© et la rigiditĂ© d’Apple. Nous avons eu de nombreux problĂšmes pour obtenir une licence, une application en accord avec nos brief et sans beaucoup de possibilitĂ©s pour interagir.

  • Question 11 : Quels sont les conseils de chacun pour bien mener de tels projets ?

Fortis : toujours garder l’Ɠil sur le produit final.

Arval : avoir une vision claire de l’objectif Ă  atteindre et intĂ©grer toutes les fonctions clĂ©s au projet (IT notamment pour les questions sĂ©curitĂ©, synchronisation, data
 et le marketing).

Corsairfly : Tester en conditions réelles ! Ce qui permettra un REX des personnes concernées.

Axa : c’est une opportunitĂ© pour les DSI de porter l’innovation. Il ne faut pas avoir peur de se tromper, le projet sera enrichi avec les retours d’usage.

Suggestion d'articles :

  1. Petit-dĂ©jeuner OCTO – Tablettes : passons Ă  l’ùre du post-PC le 26 janvier
  2. Petit dĂ©jeuner mobilitĂ© – iPad, iPhone Android en banque et assurance, prĂ©parez-vous au coup d’aprĂšs !
  3. CR du petit-dĂ©jeuner organisĂ© par OCTO et Quartet FS « L’analyse dĂ©cisionnelle en temps rĂ©el Convergence entre Big Data et Complex Event Processing »

Catégories: Blog Société

Data Grid or nosql? same, same but different


jeu, 02/02/2012 - 09:05

Depuis trois ans maintenant, NoSQL remet en question le monde centralisĂ© des RDBMS. Les espaces de stockage distribuĂ©s ne sont pour autant pas nouveaux et les banques, les plateformes de jeux utilisent des « grilles de donnĂ©es » pour adresser leurs enjeux de dĂ©bit et de latence.

Quels sont les points communs? les principales diffĂ©rences entre les univers NoSQL et « data grids »?

Lire la suite…

Suggestion d'articles :

  1. Vers des API haut niveau pour Java et NoSQL avec Spring Data
  2. Petit-dĂ©jeuner NoSQL : « l’Extreme Transaction Processing » devient une rĂ©alitĂ©
  3. VidĂ©o du petit-dĂ©jeuner NoSQL : « l’Extreme Transaction Processing » devient une rĂ©alitĂ©

Catégories: Blog Société

Tous les navigateurs acceptent HTML5 et CSS3

mer, 02/01/2012 - 16:36

Tous les navigateurs acceptent HTML5 et CSS3 mais tous ne comprennent pas leurs nouvelles fonctionnalitĂ©s. L’usage de nouveaux attributs HTML5 ou de nouvelles propriĂ©tĂ©s CSS3 ne bloquera pas votre navigateur, ce dernier les ignora tout simplement. Un avantage indĂ©niable qui nous permet d’utiliser dĂšs aujourd’hui HTML5 et CSS3 mĂȘme si certains de nos utilisateurs ne disposent pas encore de navigateurs les supportant. Comme je le prĂ©cisais dans l’article Osez renoncer aux vieux navigateurs, il ne faut pas avoir peur d’utiliser des fonctionnalitĂ©s HTML5 et CSS3 car des comportements dĂ©gradĂ©s natifs existent. Quels sont les comportements dĂ©gradĂ©s natifs acceptables ? Comment profiter d’une fonctionnalitĂ© HTML5 ou CSS3 si son comportement dĂ©gradĂ© n’est pas acceptable ? Comment pallier l’absence de support des nouvelles API JavaScript si le navigateur ne les possĂšde pas ?

Les comportements dégradés natifs

Des comportements dégradés existent nativement pour la majorité des nouveautés HTML5 et CSS3 lorsque celles-ci ne sont pas supportées par le navigateur. Prenons deux exemples pour illustrer comment les vieux navigateurs se comportent.

HTML5

Certaines fonctionnalitĂ©s HTML5 sont des Ă©volutions de fonctionnalitĂ©s existantes, c’est notamment le cas pour les formulaires. Prenons l’exemple des nouveaux types de champs de saisie qui permettent de spĂ©cifier un champ de saisie en tant que champ de saisie e-mail, tĂ©lĂ©phone, date, etc. Cette spĂ©cification permet d’avoir un clavier spĂ©cifique sur les mobiles et une validation adĂ©quate cotĂ© navigateur. Ci-dessous un exemple d’un champ de saisie de type email sur Firefox pour Android 4.

Validation coté client et clavier adapté sur Firefox Android

Code original :

1
<input type="email">

Code compris par un navigateur ne supportant pas les formulaires HTML5 :

1
<input type="text">

Si le navigateur ne comprends pas le type (email dans notre cas), le type par dĂ©faut utilisĂ© sera text. Votre formulaire sera donc totalement fonctionnel sur un ancien navigateur, votre utilisateur ne bĂ©nĂ©ficiera pas d’un clavier spĂ©cifique ni de la validation cotĂ© client mais il pourra soumettre le formulaire. Tout le monde peut utiliser votre formulaire et vos utilisateurs qui utilisent un navigateur rĂ©cent bĂ©nĂ©ficieront de fonctionnalitĂ©s intĂ©ressantes sans la moindre charge de dĂ©veloppement.

CSS3

On bénéficie également de ces comportements natifs sur les CSS3.

Si vous voyez les coins arrondis, vous ĂȘtes un utilisateur gĂ©nial qui utilise un navigateur rĂ©cent. Sinon mettez Ă  jour votre navigateur.

Style original :

1
2
3
4
5
6
.boite-arrondie {
  border-radius: 5px;
  padding: 5px;
  background: #ddd;
  border: 2px solid #777;
}

Style utilisé par un navigateur ne supportant pas la propriété CSS3 border-radius :

1
2
3
4
5
.boite-arrondie {
  padding: 5px;
  background: #ddd;
  border: 2px solid #777;
}

Si une propriĂ©tĂ© n’est pas comprise, elle est tout simplement ignorĂ©e par le navigateur et les coins sont rectangulaires. Sans les CSS3, il nous faudrait 1 Ă  6 images afin de reproduire ce rendu, ce qui en terme de performance n’est pas anodin ni en terme de complexitĂ© de code ajoutĂ©. Est-ce inacceptable de se priver des coins arrondis sur les anciens navigateurs ? Est-ce pertinent de passer du temps et augmenter la complexitĂ© du code ? Il est important de se poser ces questions pour les nouvelles fonctionnalitĂ©s CSS3 qui vous intĂ©ressent.

Ce comportement est notamment trĂšs utilisĂ© par les navigateurs qui prĂ©fixent les propriĂ©tĂ©s lorsque l’implĂ©mentation n’est pas finale. L’utilisation des prĂ©fixes sur certaines propriĂ©tĂ©s n’est pas utile lorsque les navigateurs supportent la propriĂ©tĂ© sans prĂ©fixe depuis plusieurs versions. Des sites comme Can I Use et CSS3 Generator vous permettront de voir si les prĂ©fixes sont indispensables. Ils sont inutiles pour border-radius mais impĂ©ratifs pour les gradients :

1
2
3
4
5
6
7
.fond-degrade {
  background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%);
  background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
  background: -o-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
  background: -ms-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
  background: linear-gradient(top, #1e5799 0%,#7db9e8 100%);
}
Et si ce comportement dĂ©gradĂ© n’est pas acceptable ?

Il peut arriver que le comportement dĂ©gradĂ© ne soit pas acceptable et qu’il faille envisager une autre solution. Une approche pourrait ĂȘtre de s’interdire d’utiliser une nouvelle fonctionnalitĂ© car 30% des navigateurs de vos utilisateurs ne la supportent pas. Une mauvaise approche car on nivelle par le bas et on se prive de fonctionnalitĂ©s intĂ©ressantes pour l’utilisateur et le dĂ©veloppeur. L’utilisateur profite d’une meilleure expĂ©rience utilisateur. Le dĂ©veloppeur simplifie et rĂ©duit son code car une partie est implĂ©mentĂ©e par le navigateur.

L’approche Graceful degradation

L’approche Graceful degradation consiste Ă  profiter des nouvelles fonctionnalitĂ©s et proposer une solution de contournement lorsqu’elles ne sont pas disponibles. Pour cela, la librairie JavaScript Modernizr expose de nombreuses mĂ©thodes permettant de dĂ©tecter le support d’une fonctionnalité  HTML5 ou CSS3. On peut ainsi utiliser un Polyfill ou encore, si on dĂ©cide de ne pas implĂ©menter du tout cette fonctionnalitĂ© dans ce cas, alerter l’utilisateur que la fonctionnalitĂ© n’est pas disponible. Un Polyfill est un plugin qui fournit une fonctionnalitĂ© que le navigateur devrait possĂ©der nativement. Une longue liste de Polyfill est rĂ©fĂ©rencĂ©e sur GitHub par Modernizr. Ci-dessous un exemple de champ de saisie textuel avec le nouvel attribut placeholder (texte d’aide dans le champ de saisie lorsque celui-ci est vide).

Code HTML :

1
<input type="text" placeholder="exemple de placeholder" />

Code JavaScript permettant de gĂ©rer le non support de l’attribut placeholder :

1
2
3
4
5
// si le navigateur ne supporte pas placeholder
if (!Modernizr.input.placeholder) {
  // ajout du comportement avec un plugin jQuery
  $('input[placeholder]').placeholder();
}

L’avantage de cette technique est d’isoler le code liĂ© Ă  la solution de contournement. Ceci nous permettra de le supprimer sans crainte lorsque vos utilisateurs n’utiliseront plus de navigateurs ne supportant pas cet attribut.

L’utilisation de la cascade pour les CSS

En CSS3, certaines propriétés ont de nouvelles valeurs possibles. Il est alors possible de définir deux fois une propriété avec deux valeurs différentes. Prenons par exemple une boite avec un fond semi-transparent :

Si votre navigateur est récent, le fond de ce paragraphe est vert et transparent. Sinon il est rouge vif.

1
2
3
4
.fond-avec-transparence {
  background-color: #ff0000;
  background-color: rgba(0,255,0,0.5);
}

Les navigateurs ne supportant pas CSS3 ne comprendront que la premiÚre valeur donc le fond sera rouge. Quant aux navigateurs supportant CSS3, ils comprendront les deux valeurs. Ils appliqueront donc la derniÚre valeur rencontrée pour la propriété ce qui nous donnera un fond vert avec une transparence de 50%.

Des comportements dégradés pour les nouvelles APIs ?

HTML5 apporte de nouvelles APIs JavaScript (Web Storage, Geolocation, etc.). Ces APIs sont directement utilisables sans import puisque exposĂ©es par le navigateur. Des erreurs JavaScript seront donc levĂ©es si vous les utilisez alors que votre navigateur ne les possĂšde pas. Aucun comportement dĂ©gradĂ© n’existe par dĂ©faut, c’est Ă  vous de tester la disponibilitĂ© de ces APIs avant de les utiliser. Comme pour les balises HTML5 ou le CSS3, Modernizr permet de tester facilement la disponibilitĂ© de ces nouvelles API pour proposer une solution alternative ou non. Un exemple ci-dessous avec l’API localStorage :

1
2
3
4
5
// si le navigateur supporte le localStorage
if (Modernizr.localstorage) {
  // stockage d'une valeur dans le Web Storage local
  localStorage.setItem("clé", "valeur");
}
Aucune raison de ne plus utiliser HTML5 et CSS3

Des solutions existent pour pallier l’absence de support HTML5, parfois simple et fiable, parfois trop complexe ou trop impactant sur les performances du client. C’est un choix Ă  prendre sur la solution de contournement lorsque vous dĂ©cidez d’utiliser HTML5 et CSS3. Le site HTML5 Please pourra vous aider Ă  prendre ces dĂ©cisions en vous donnant le support des fonctionnalitĂ©s et en vous conseillant sur leur utilisation. D’aprĂšs les statistiques de StatCounter du mois de janvier, prĂšs de 70% des français utilisent un navigateur rĂ©cent qui supporte relativement bien HTML5 et CSS3. Profitez des nouvelles fonctionnalitĂ©s HTML5 et CSS3, des comportements dĂ©gradĂ©s natifs et ne prĂ©voyez de solution alternative que si c’est indispensable.

Suggestion d'articles :

  1. Osez renoncer aux vieux navigateurs
  2. OCTO Ă  Paris Web 2010 pour un atelier HTML5
  3. HTML5, offline et sécurité

Catégories: Blog Société

Une base de données purement fonctionnelle

mar, 01/31/2012 - 10:24

Le modĂšle relationnel est nĂ© Ă  une Ă©poque oĂč l’espace Ă©tait rare, et fut donc conçu pour minimiser le niveau de redondance des donnĂ©es: il Ă©tait plus Ă©conomique de stocker une indirection vers une chaine de caractĂšres que de stocker cette chaine deux fois.
Aujourd’hui, cette contrainte d’espace ne tient plus. On achĂšte un Teraoctet pour 100 dollars, la RAM est abondante, et les disques flash aux performances Ă©levĂ©es vont bientĂŽt rejoindre le prix des disques durs rotatifs.

Deux limitations fondamentales du stockage ont donc disparu: le coût de la redondance et le coût de la non-localité pour le traitement de structures de données complexes. Il est maintenant possible de concevoir de nouvelles bases de données plus riches et plus sûres.

Update in place is a poison apple.
- Jim Gray, Turing Award 1998

Le choix d’une base de donnĂ©es mutables n’est plus optimal. Les bases de donnĂ©es purement fonctionnelles n’existent pas encore, mais je pense que les utilisateurs de bases de donnĂ©es auraient dĂ©jĂ  intĂ©rĂȘt Ă  envisager le stockage read-only et le versioning manuel.

Que veut-on dire par « base de donnĂ©es mutables »? Il s’agit d’une BDD dans laquelle chaque donnĂ©e peut ĂȘtre modifiĂ©e Ă  tout moment, et dans laquelle on ne garde pas l’historique de ses modifications. Les modifications sont faites « sur place », de maniĂšre destructive.

Que veut-on dire par « base de donnĂ©es purement fonctionnelle »? Il s’agirait d’une BDD dans laquelle chaque structure de donnĂ©e serait purement fonctionnelle, c’est-Ă -dire immuable par dĂ©faut et ne ferait rĂ©fĂ©rence qu’Ă  des donnĂ©es immuables. Pour prendre une analogie programmatique, cette BDD serait une interface vers des snapshots versionnĂ©s. Une sorte de Git!

Vers une implémentation plus adaptée

Les donnĂ©es d’une BDD mĂ©ritent un traitement diffĂ©renciĂ© en fonction de leurs patterns d’usage. Pourquoi par exemple, chez un grand opĂ©rateur tĂ©lĂ©phonique, devrait-on utiliser le mĂȘme objet « table » pour rĂ©fĂ©rencer les monnaies, gĂ©rer la liste des clients et la liste des appels? Examinons leurs particularitĂ©s. A partir de ces trois exemples simplifiĂ©s nous allons infĂ©rer plusieurs mĂ©canismes fondamentaux d’une base de donnĂ©es purement fonctionnelle.

La liste de référence des monnaies est peu volumineuse. Elle est mise à jour quelques fois par an, tout au plus.
La liste des clients de l’opĂ©rateur est moyennement volumineuse. Elle est mise Ă  jour quotidiennement, avec quelques ajouts, suppressions et modifications alĂ©atoires.
La liste des appels est trĂšs volumineuse. Elle est mise Ă  jour quotidiennement, mais seulement en insertion.

Nous avons donc au moins trois cas d’usage trĂšs diffĂ©rents. Or dans une BDD classique, ces trois donnĂ©es sont stockĂ©es de la mĂȘme maniĂšre, c’est-Ă -dire sous la forme de listes mutables et indexĂ©es.
Beaucoup d’effort a Ă©tĂ© investi pour amĂ©liorer les performances de ces tables avec le matĂ©riel donnĂ©, mais les solutions proposĂ©es sont encore trĂšs gĂ©nĂ©riques.

Revenons Ă  nos trois donnĂ©es. Il est possible de les implĂ©menter autrement, en faisant appel Ă  trois types d’objets:

  • Des listes immuables (de type homogĂšne, et implĂ©mentĂ©es par exemple par des hashtables sur la clef primaire)
  • Des deltas sur ces listes
  • Quelques mĂ©tadonnĂ©es peu volumineuses qui serviront Ă  articuler l’ensemble.

La table des monnaies est l’exemple typique d’une liste simple et immuable. La liste d’aujourd’hui s’appelle la ‘v1′. Si demain une union monĂ©taire est créée en AmĂ©rique du sud, nous crĂ©erons une copie modifiĂ©e qui s’appellera la ‘v2′. Pour des raisons de performance, la v1 et la v2 devront ĂȘtre copiĂ©es intĂ©gralement sur tous les noeuds de la base de donnĂ©es. La performance en update de cette implĂ©mentation est mĂ©diocre, mais toutes les lectures pourront ĂȘtre faites sans aucun mĂ©canisme de synchronisation.

La table des clients est un peu plus volatile. Tous les jours quelques clients arrivent ou s’en vont, et quelques clients existants peuvent modifier leur adresse postale. Nous pouvons stocker la liste des clients comme une liste immuable ‘v1′, accompagnĂ©e par une sĂ©quence chronologique de deltas. D’ici Ă  quelques mois, l’accumulation des deltas commencera Ă  affecter la vitesse de lecture: il faudra alors matĂ©rialiser la liste, la nommer ‘v287′ et archiver la v1. Dans le cas d’une machine seule, nous retrouvons presque exactement la maniĂšre dont Git stocke son historique. Dans le cas d’un cluster, il est bien sĂ»r prĂ©fĂ©rable de partitionner/sharder cette liste sur tous les nƓuds.
Selon quelle politique va-t-on vouloir archiver une version, la compresser ou la supprimer? Et selon quelles modalités? Chaque utilisateur doit prendre cette décision en fonction de ses besoins métier. Il est agréable, en tout cas, de remarquer que le Data Lifecycle Management est offert sur un plateau par les BDD fonctionnelles.

La table des appels tĂ©lĂ©phoniques est diffĂ©rente. Chaque jour elle reçoit des milliers de nouvelles lignes, lesquelles sont parfaitement indĂ©pendantes des lignes antĂ©rieures. Cette liste est segmentable par journĂ©e, et chacun des segments quotidiens est une liste immuable. Nous devrions en plus partitionner chaque segment de maniĂšre Ă  coller Ă  la liste des clients: l’ID du client devient alors la clef de partitionnement des appels tĂ©lĂ©phoniques.

En rĂ©sumĂ©, Ă  travers ces mĂ©canismes de mise Ă  jour, on accepte de consommer un peu plus d’espace disque, et de rĂ©duire la localitĂ© des donnĂ©es (car une nouvelle version ne sera probablement pas Ă©crite Ă  cĂŽtĂ© de l’ancienne). Tout cela pour garder une information plus riche.
Remarquez bien que ces trois idĂ©es de versioning s’appliquent aussi bien Ă  l’implĂ©mentation d’une nouvelle base de donnĂ©es qu’Ă  une implĂ©mentation manuelle, basĂ©e sur les outils d’aujourd’hui.

Conséquences

VoilĂ  pour les bases. Observons maintenant les consĂ©quences positives de ces nouveaux choix d’implĂ©mentation.

Il devient possible par exemple:

  • d’attribuer un identifiant unique Ă  une version complĂšte de la BDD, donc d’exĂ©cuter des requĂȘtes de lecture sur une version du passĂ©
  • d’effectuer un rollback Ă  tout moment, en reprenant une ancienne version. Pas besoin d’attendre des heures pour recharger!
  • de parallĂ©liser le requĂȘtage Ă  l’infini (car les listes immuables et les deltas sont triviaux Ă  copier)
  • de hasher cryptographiquement le contenu (Ă  la Git), pour un usage lĂ©gal ou contractuel
  • de connaitre la sĂ©quence des processus qui ont fait Ă©voluer la base ou une ligne en particulier
  • de diminuer le coĂ»t du backup et du Plan de Reprise d’ActivitĂ©. RĂ©aliser trois copies vers des disques sur Ă©tagĂšre coĂ»te peu (car les deltas sont copiables via des Ă©critures non-alĂ©atoires, donc rapides, et sans consommer de CPU)
  • de cacher le rĂ©sultat de toute sorte de traitements, Ă  la maniĂšre de vues matĂ©rialisĂ©es (filtrage, agrĂ©gation..)
  • de stocker dans la mĂȘme BDD des objets classiques relationnels, et des objets plus variĂ©s (key-value store..)

En l’absence d’ « Ă©tat global », nous offrons aux processus d’alimentation et d’interrogation de la BDD tous les bĂ©nĂ©fices de la programmation purement fonctionnelle. Ces processus deviennent rĂ©fĂ©rentiellement transparents (donc sans effet de bord), d’oĂč une meilleure lisibilitĂ© pour les Ă©quipes de dĂ©veloppement et de maintenance, et une diminution du risque d’erreur. De plus, nous avons la garantie que l’ordre d’exĂ©cution des processus n’a plus aucune importance.
La qualitĂ© de transparence rĂ©fĂ©rentielle nous aide aussi Ă  implĂ©menter proprement le pattern Command-Query Separation (CQS), qui conseille de sĂ©parer les processus de requĂȘtage des processus d’Ă©criture. Les nombreux « lecteurs » opĂšrent sur des donnĂ©es immuables, Ă©ventuellement dissĂ©minĂ©es dans un cluster, alors que le processus « modificateur » agit sur les donnĂ©es de rĂ©fĂ©rence pour leurs ajouter des deltas.

Quelles sont les contreparties? Il devient plus couteux de rĂ©aliser de nombreuses modifications alĂ©atoires sur une grande table. Une BDD purement fonctionnelle ne serait donc pas adaptĂ©e Ă  la table d’inventaire d’Amazon, mĂȘme si l’usage de disques SSD permettrait d’annuler une grande partie de la dĂ©gradation de performance.

Remarquez encore une fois qu’une grande partie de ces bĂ©nĂ©fices/contreparties s’applique telle quelle dans le cas d’un versioning manuel.

Conclusion

Le choix historique d’implĂ©menter les BDD Ă  l’aide de donnĂ©es mutables n’est plus optimal. Le besoin de protĂ©ger les mises Ă  jour dans un environnement concurrent nuit Ă  la scalabilitĂ©, et l’absence d’historique et de points de retour rend toute manipulation pĂ©rilleuse.
Une base de données purement fonctionnelle serait intrinsÚquement plus sûre, et offrirait une meilleure scalabilité pour de nombreuses applications. En outre, ses besoins seraient tout à fait compatibles avec les bénéfices des disques flash.
Mon pari est qu’une telle base de donnĂ©es va rĂ©ellement exister dans les annĂ©es Ă  venir. Le monde acadĂ©mique en parle depuis les annĂ©es 80; voir notamment la thĂšse de Phil Trinder qui avait dĂ©jĂ  identifiĂ© les consĂ©quences de la transparence rĂ©fĂ©rentielle dans les bases de donnĂ©es, puis ouvert la voie vers le requĂȘtage monadique (LINQ) avec ses collĂšgues de l’universitĂ© de Glasgow. Il ne lui manquait que du matĂ©riel plus performant.
Aujourd’hui, la startup RethinkDB et la base in-memory HANA utilisent dĂ©jĂ  une partie de cette technologie et atteignent de belles performances.
En attendant l’arrivĂ©e et la maturation de ces nouveaux outils, il est dĂ©jĂ  possible d’enrichir manuellement nos BDD pour bĂ©nĂ©ficier, en partie, de leurs avantages.

Bibliographie

http://www-03.ibm.com/ibm/history/exhibits/storage/storage_3330.html (Histoire du disque dur IBM 3330)
http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-TN-1997-018.pdf (GénÚse du SQL)
www.cs.ox.ac.uk/files/3404/PRG82.pdf: Phil Trinder « A functional database »
http://www.quora.com/What-would-be-the-main-advantages-of-a-(purely-)-functional-database
http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html
http://research.microsoft.com/~gray/papers/theTransactionConcept.pdf (ImplĂ©mentations d’une transaction)

Suggestion d'articles :

  1. Outiller un audit de base de données
  2. Industrialisation des développements : automatisez votre base de données
  3. Des alternatives aux bases de données relationnelles


Catégories: Blog Société

Délégation de tùches avec ZeroMQ

lun, 01/30/2012 - 12:57

La dĂ©lĂ©gation de tĂąches en asynchrone est un moyen efficace d’allĂ©ger la charge que subissent nos systĂšmes. En effet, de nombreux cas d’utilisation ne nĂ©cessitent pas d’ĂȘtre exĂ©cutĂ©s de façon synchrone lorsqu’un utilisateur effectue une action ou qu’un Ă©vĂ©nement extĂ©rieur intervient.

Par exemple, lorsqu’il n’est pas nĂ©cessaire de restituer la derniĂšre version des donnĂ©es et que le traitement avant restitution est coĂ»teux en ressources, il est possible de renvoyer des donnĂ©es prĂ©alablement mises en cache et de dĂ©porter en asynchrone une tĂąche de rafraĂźchissement de ce cache.

Un autre exemple concerne les systĂšmes qui mĂȘlent des requĂȘtes fortement consommatrices en ressources (CPU, mĂ©moire, …) et des requĂȘtes peu consommatrices pour lesquelles on va vouloir garantir une latence faible mĂȘme lorsque des requĂȘtes consommatrices sont en cours de traitement. Pour cela, dĂ©lĂ©guer les traitements coĂ»teux Ă  des workers via une file de messages peut aider Ă  garantir des temps de rĂ©ponse faibles pour les autres requĂȘtes. Cette sĂ©paration est d’autant plus importante sur des systĂšmes qui s’appuient sur des technologies monothreadĂ©es telles que Ruby ou NodeJS (ce dernier a nĂ©anmoins l’avantage de ne pas consommer de ressources/process lorsqu’il effectue des I/O).

Pour rĂ©soudre cette problĂ©matique de dĂ©lĂ©gation de tĂąches, on utilise habituellement une solution comme ActiveMQ ou RabbitMQ. Seulement, lorsqu’il est nĂ©cessaire :

  • d’ĂȘtre tolĂ©rant Ă  la panne
  • d’ĂȘtre scalable que ce soit en ajoutant des publishers (qui soumettent les tĂąches asynchrones) ou des workers (qui consomment et exĂ©cutent ces tĂąches)
  • de pouvoir intĂ©grer des systĂšmes hĂ©tĂ©rogĂšnes s’exĂ©cutant sur diffĂ©rentes plateformes (Java, Ruby, NodeJS, C, …)

aucune de ces deux solutions ne permet de satisfaire l’ensemble de ces critĂšres. Cet article prĂ©sente une solution possible Ă  base de ZeroMQ, Ă©crite en NodeJS et utilisĂ©e pour traiter les deux exemples prĂ©cĂ©dents.

ZeroMQ : Super sockets

ZeroMQ est une bibliothĂšque rĂ©seau Ă©crite en C++ et qui offre des bindings dans de nombreux langages. Elle procure une couche d’abstraction au-dessus des sockets TCP classiques pour ajouter quelques fonctionnalitĂ©s :

  • une communication par message. Contrairement Ă  TCP ou UDP, un message est reçu dans son intĂ©gralitĂ© ou n’est pas reçu du tout, jamais partiellement. En effet, lorsqu’on utilise des sockets TCP, pour rĂ©ceptionner des donnĂ©es, il est nĂ©cessaire de dĂ©terminer la taille des messages ou de rechercher un dĂ©limiteur. ZeroMQ le fait pour nous, il nous renvoie le message dans sa globalitĂ©. Les messages ZeroMQ sont composĂ©s de frames qui permettent de segmenter les informations passĂ©es.
  • la gestion des reconnexions lors d’une coupure.
  • la gestion d’une file de messages au niveau de la socket. Ainsi, lors de la perte d’une connexion, aucun message ne sera perdu, ZeroMQ se chargera de transmettre les messages en file d’attente lorsque la connexion aura Ă©tĂ© rĂ©-Ă©tablie. ZeroMQ offre ainsi la possibilitĂ© de crĂ©er un systĂšme de messagerie sans broker en connectant les Ă©lĂ©ments du systĂšme en peer-to-peer. La notion de broker pourra toutefois ĂȘtre rĂ©introduite suivant les besoins.
  • l’abstraction du protocole de transport des messages:
    • TCP pour une communication sur le rĂ©seau,
    • PGM pour une communication en multicast sur le rĂ©seau,
    • IPC pour une communication inter-process au sein d’un mĂȘme hĂŽte,
    • INPROC, pour une communication au sein d’un mĂȘme processus (entre plusieurs threads par exemple).
  • le support de diffĂ©rents patterns de communication suivant l’association des types de sockets ZeroMQ :
    • PUB-SUB : l’association des sockets PUB et SUB permet de distribuer des messages d’un publisher (socket PUB) vers N consommateurs (socket SUB) qui reçoivent tous les mĂȘmes messages,
    • REQ-REP : le pattern classique de requĂȘte/rĂ©ponse (1 publisher, 1 consommateur),
    • PUSH-PULL : la socket de type PUSH distribue les messages en round-robin dans la file de messages des sockets de type PULL connectĂ©es : 1 publisher et N consommateurs qui se rĂ©partissent la consommation des messages.

Pour utiliser ces patterns de communication, une socket ZeroMQ est capable de se connecter Ă  plusieurs autres sockets ZeroMQ. Le comportement lors de l’envoi d’un message sur une socket ZeroMQ connectĂ©e Ă  plusieurs sockets dĂ©pendra du type de cette socket.

Délégation de tùches scalable et tolérante à la panne

Bien que ZeroMQ fonctionne sans broker, il peut ĂȘtre nĂ©cessaire de rĂ©introduire dans l’architecture un Ă©lĂ©ment de ce type afin de limiter le nombre de connexions rĂ©seau. Par exemple, dans une architecture de dĂ©lĂ©gation de tĂąches, avec 100 publishers et 100 workers, sans broker, il faudra Ă©tablir 10 000 connexions (100 publishers * 100 workers) qui risquent d’engorger le rĂ©seau. Avec 2 brokers (pour supporter la panne de l’un d’entre eux), il faudra 400 connexions (100 publishers * 2 brokers + 100 workers * 2 brokers).

ZeroMQ propose 2 autres types de sockets qui permettent notamment le routage de messages :

  • ROUTER : cette socket ajoute aux messages entrant l’identifiant de la socket ZeroMQ source dans une nouvelle frame qui devient la premiĂšre frame du message. Ensuite, elle utilise cet identifiant des messages sortants (en supprimant la premiĂšre frame du message) pour sĂ©lectionner la socket destination du message (si elle est connectĂ©e bien sĂ»r). En modifiant cette frame, nous sommes capables de personnaliser le routage des messages sortants via cette socket. L’identifiant d’une socket peut ĂȘtre spĂ©cifiĂ© Ă  la crĂ©ation sinon il sera gĂ©nĂ©rĂ© alĂ©atoirement par ZeroMQ.
  • DEALER : cette socket permet de recevoir et envoyer des messages (contrairement Ă  la socket PUSH qui peut seulement en envoyer). L’envoi de messages se faisant en round-robin aux sockets connectĂ©es.

Avec ces différents types de sockets nous pouvons les assembler de la façon suivante pour obtenir notre systÚme de délégation de tùches asynchrones avec les caractéristiques suivantes :

  • chaque publisher peut publier une tĂąche sur n’importe quel broker,
  • chaque worker peut rĂ©cupĂ©rer une tĂąche et publier le rĂ©sultat sur n’importe quel broker,
  • les brokers sont capables de router le rĂ©sultat d’une tĂąche vers le publisher qui l’a publiĂ©e.


Distribution de tĂąches avec ZeroMQ

NB : Nous utilisons ici 3 brokers, pour Ă©viter que les workers envoient systĂ©matiquement le mĂȘme type de message au mĂȘme broker (ce qui aurait Ă©tĂ© le cas avec 2 brokers car le worker envoie alternativement un message READY et un message RESULT).

Cette architecture permet de supporter la perte de n’importe quel composant mais aussi d’ajouter des publishers, des brokers ou des workers suivant la charge de tĂąches Ă  traiter.

  • Publication des tĂąchesEn utilisant une socket de type DEALER du cĂŽtĂ© des publishers, celle-ci Ă©tant connectĂ©e Ă  tous les brokers, les messages sont envoyĂ©s en round-robin (par ZeroMQ) vers les brokers (Ă©tapes 1, 2 et 3 Ă  partir des publishers). Si un broker venait Ă  disparaitre, la socket DEALER continuerait Ă  dialoguer avec les brokers restants et lorsque le broker perdu serait de nouveau accessible, ZeroMQ se chargera de se reconnecter sur ce broker qui rĂ©intĂšgrera alors le cycle de round-robin d’envoi de messages.
    Les messages envoyĂ©s ne contiennent qu’une seule frame contenant les donnĂ©es de la tĂąche Ă  exĂ©cuter :Format du message envoyĂ© par un publisherCode du Publisher :

    1
    2
    3
    4
    5
    6
    7
    8
    
    var broker = zeromq.createSocket('dealer');
    ["tcp://broker1:5555",
     "tcp://broker2:5555",
     "tcp://broker3:5555"].forEach(function(address) {
      broker.connect(address);
    });
    ...
    broker.send("task data");
  • Les messages provenant des publishers sont reçus sur une socket ROUTER sur un des brokers. Celle-ci ajoute une frame contenant l’identifiant de la socket DEALER du publisher qui a envoyĂ© le message. Ceci permettra, si le message est envoyĂ© via une socket ROUTER connectĂ©e Ă  ce publisher, de router le message vers le bon publisher.
    Le broker a la charge de gĂ©rer une file de messages en mĂ©moire, dans un fichier ou dans une base de donnĂ©es selon les besoins (garantie de ne pas perdre de message, performances, …).
    Les messages traités par le broker contiennent donc 2 frames :Format du message traité par le brokerCode du broker :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var publishers = zeromq.createSocket('router');
    publishers.on('message', function() {
      // Process messages from publishers
      var publisher_id = arguments[0],
          task_data = arguments[1];
     
      // Store in a queue
      ...
    });
    publishers.bindSync("tcp://*:5555");
  • Notification d'un worker prĂȘt Ă  traiter une tĂącheDu cĂŽtĂ© workers, ces derniers se connectent Ă  tous les brokers via une socket DEALER. Ils envoient un message de type READY (en utilisant une frame) pour rĂ©cupĂ©rer une tĂąche disponible sur les brokers (Ă©tapes 1 et 4 Ă  partir des workers). Le type du message est gĂ©rĂ© dans le code applicatif et non pas par ZeroMQ. Il permet au code applicatif du broker de diffĂ©rencier les messages en provenance des workers :
    • READY pour prĂ©ciser que le worker est prĂȘt Ă  traiter une tĂąche,
    • RESULT pour prĂ©ciser que le message contient le rĂ©sultat d’une tĂąche qui devra ĂȘtre transmis au publisher ayant publiĂ© la tĂąche.

    En utilisant une socket DEALER, les messages seront donc alternativement envoyĂ©s sur l’un ou l’autre des brokers et la socket gĂ©rera la perte d’un broker.
    Le message envoyé par un worker pour récupérer une tùche ressemble donc à :

    Format du message READYLe code du worker :

    1
    2
    3
    4
    5
    6
    7
    8
    
    var broker = zeromq.createSocket('dealer');
    broker.on('message', function() {...});
    ["tcp://broker1:5555",
     "tcp://broker2:5555",
     "tcp://broker3:5555"].forEach(function(address) {
      broker.connect(address);
    });
    broker.send(READY);
  • De la mĂȘme maniĂšre que du cĂŽtĂ© publisher, un message READY se verra ajouter une frame contenant l’identifiant du worker qui l’a envoyĂ© par la socket ROUTER du broker :Format du message READY sur le broker
  • Avec un message contenant une tĂąche Ă  exĂ©cuter (provenant d’un publisher) et d’un message READY (provenant d’un worker disponible), le broker peut constituer un message contenant la tĂąche en plaçant l’identifiant d’un worker disponible dans la premiĂšre frame afin que le message soit routĂ© vers ce worker par la socket ROUTER (qui supprimera au passage cette premiĂšre frame):Format du message contenant la tĂąche et envoyĂ© par le broker au workerLe code du broker devient alors :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var workers = zeromq.createSocket('router');
    workers.on('message', function() {
      // Process messages from workers
      var worker_id = arguments[0],
          message_type = arguments[1]; // READY
     
      if (message_type == READY) {
        // dequeue tasks
        var task, publisher_id = ...;
        workers.send(worker_id, publisher_id, task);
      }
    });
    workers.bindSync("tcp://*:5555");
  • RĂ©cupĂ©ration d'une tĂąche par un worker prĂȘtLe worker (celui qui a envoyĂ© un message READY) reçoit alors le message (Ă©tape 2 Ă  partir du broker1) suivant contenant la tĂąche Ă  exĂ©cuter :Format du message reçu par un workerLe handler de rĂ©ception d’un message sur le worker :
    1
    2
    3
    4
    5
    6
    7
    
    broker.on('message', function() {
      // Process task messages from broker
      var publisher_id = arguments[0],
          task_data = arguments[1];
      // process task
      ...
    });

Cette architecture permet aux workers de renvoyer une rĂ©ponse au publisher si l’on veut par exemple que le publisher rĂ©ponde de façon synchrone sans pour autant accaparer le CPU et bloquer les requĂȘtes suivantes (cas de NodeJS ici). Le cheminement inverse s’effectue alors de la façon suivante :

  • Envoi du rĂ©sultat d'une tĂąche par un workerLe worker envoie un message contenant le rĂ©sultat via sa socket DEALER vers les brokers (toujours en round-robin et suivant la disponibilitĂ© de ces derniers) en utilisant une frame pour spĂ©cifier un type de message RESULT (Ă©tape 3 Ă  partir des workers) :Format d'un message rĂ©sultat envoyĂ© par un workerCode du handler de traitement des messages par un worker :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    broker.on('message', function() {
      // Process task messages from broker
      var publisher_id = arguments[0],
          task_data = arguments[1];
      // process task
      ...
     
      // Send a result to the publisher
      broker.send(RESULT, publisher_id, result);
      // Send READY message to get a new task
      broker.send(READY);
    });
  • Un des brokers reçoit le message via sa socket ROUTER qui ajoute une frame avec l’identifiant du worker. Dans ce cas-ci, l’identifiant nous sera inutile.Format du message de rĂ©sultat reçu par le brokerL’identifiant du publisher Ă  l’origine de la tĂąche Ă©tant toujours prĂ©sent dans le message, il est possible de lui envoyer le message suivant sur la socket ROUTER sur laquelle sont connectĂ©s les publishers. La socket routera alors le message vers le bon publisher :

    Format du message résultat envoyé par le broker au publisherLe handler des messages en provenance des workers devient alors :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    workers.on('message', function() {
      // Process messages from workers
      var worker_id = arguments[0],
          message_type = arguments[1], // READY or RESULT
          publisher_id = arguments[2],
          result = arguments[3];
     
      if (message_type == READY) {
        // dequeue tasks
        var task, publisher_id = ...;
        workers.send(worker_id, publisher_id, task);
      } else if (message_type == RESULT) {
        publishers.send(publisher_id, result);
      }
    });
  • Transmission du rĂ©sultat d'une tĂąche au publisherle publisher reçoit alors le message contenant le rĂ©sultat sur sa socket DEALER (Ă©tape 4 Ă  partir du broker2) :Format du message de rĂ©sultat reçu par un publisherLe handler de messages d’un publisher :
    1
    2
    3
    4
    5
    
    broker.on('message', function() {
      // Process messages from broker
      var result = arguments[0];
      ...
    });
Conclusion

Comme nous avons pu le constater, ZeroMQ permet d’Ă©laborer une solution adaptĂ©e Ă  ses besoins en combinant les diffĂ©rents types de sockets disponibles (d’autres exemples sont accessibles dans le guide ZeroMQ). Cette souplesse vient tout de mĂȘme au prix d’une certaine complexitĂ© puisqu’il faut Ă©laborer son propre protocole (en utilisant les frames des messages ZeroMQ) et traiter quelques sujets qui n’ont pas Ă©tĂ© abordĂ©s dans cet article comme la gestion des timeouts. Par exemple, lorsqu’un broker reçoit avec succĂšs un message READY mais ne peut rĂ©pondre au worker en raison d’une coupure rĂ©seau ou d’un crash du broker, dans ce cas lĂ , sans timeout, le worker pourrait attendre indĂ©finiment que le broker lui renvoie une tĂąche Ă  exĂ©cuter.
ZeroMQ offre aussi de trĂšs bons rĂ©sultats concernant les performances, que ce soit la latence ou le dĂ©bit de transmission des messages. Ceci en fait une bonne solution pour les systĂšmes devant traiter de gros volumes de messages (en nombre ou en taille). Il est cependant moins adaptĂ© lorsque l’on ne peut pas se permettre de perdre des messages : dans l’exemple de cet article, la file de messages est n’est pas persistĂ© sur le broker et ZeroMQ ne gĂšre pas de transaction; un message envoyĂ© aux brokers n’est donc pas garantir d’atteindre un worker ou un publisher si un broker crash.

Suggestion d'articles :

  1. Créer un cluster ActiveMQ hautement disponible
  2. Le push web vu par Diffusion – Partie 1
  3. Le push web avec Pusher

Catégories: Blog Société

Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java

ven, 01/27/2012 - 11:15

Un prĂ©cĂ©dent article a exposĂ© les grands principes de la sĂ©rialisation avec Thrift et Procotol Buffers. Ces deux frameworks promettent notamment une reprĂ©sentation des messages optimisĂ©e en termes de taille, ce qui est avĂ©rĂ© dans le benchmark JVM Serializers : Thrift et Protocol Buffers y obtiennent une rĂ©duction de taille du message de 73% par rapport Ă  la sĂ©rialisation native Java. Ce benchmark regroupe par ailleurs de nombreux autres frameworks de sĂ©rialisation du monde Java, mais se limite toutefois Ă  l’utilisation d’un unique message de test.

Le prĂ©sent article analyse l’influence de la structure (nombre et taille des objets, complexitĂ© de la grappe) sur la compacitĂ© du message sĂ©rialisĂ© pour Thrift et Protocol Buffers. La comparaison est rĂ©alisĂ©e en Java, son protocole de sĂ©rialisation standard servant de rĂ©fĂ©rence.

Conditions du test

Afin d’Ă©valuer diverses structures de messages, le prototype utilise une structure arborescente. Traditionnellement, ce type de structure est rĂ©cursif. Cependant, il n’est pas compatible avec la limitation de Thrift sur la dĂ©claration avancĂ©e abordĂ©e dans le prĂ©cĂ©dent article.
La profondeur a donc Ă©tĂ© arbitrairement limitĂ©e au niveau 6, soit 127 nƓuds au maximum pour un arbre binaire complet. Il y a un type diffĂ©rent par profondeur, de Node0 pour la racine Ă  Node6 pour les feuilles les plus basses. Les arbres gĂ©nĂ©rĂ©s le sont selon trois paramĂštres :

  • le nombre total de nƓuds, qui permet de faire varier le nombre d’objets du message,
  • la cardinalitĂ© des fratries , qui joue sur la complexitĂ© : plus cette cardinalitĂ© est faible pour un nombre de nƓuds donnĂ©, plus les fratries sont petites et nombreuses, donc plus le message est complexe,
  • et la taille des nƓuds, qui est fonction du champ « description ». Son contenu est une chaĂźne de caractĂšres diffĂ©rente pour chacun d’eux et gĂ©nĂ©rĂ©e par dĂ©calage des valeurs Unicode des caractĂšres.

La construction des arbres se fait rĂ©cursivement et Ă©quitablement entre les fils d’un nƓud. Ci-dessous trois exemples d’arbre Ă  5 nƓuds avec, de gauche Ă  droite, des tailles de fratries de 1, 2 et 3. Les numĂ©ros sont prĂ©sents Ă  titre indicatif et indiquent l’ordre de crĂ©ation des nƓuds par l’algorithme de construction.

Les dĂ©clarations dans les IDLs Thrift IDL et Protocol Buffers language sont disponibles en fin d’article. Les versions utilisĂ©es sont 0.8.0 pour Thrift, 2.4.1 pour Protocol Buffers et HotSpot 1.6.0_29 pour la JVM.

Impact du nombre d’objets du message

Dans un premier temps, la complexité est fixée au minimum :

  • La longueur des descriptions de chaque nƓud est constante (32 caractĂšres),
  • le nombre de nƓuds est variable,
  • la structure choisie est le 1024-tree qui Ă©quivaut Ă  un arbre Ă  deux niveaux dans cette Ă©tude.

En effet, si la cardinalitĂ© des fratries est supĂ©rieure au nombre de nƓuds n, on obtient un arbre Ă  deux niveaux, une racine Node0 et n-1 enfants Node1. Les 1024-trees de cet article ont tous cette structure car n est toujours infĂ©rieur Ă  1024.

Tracer la taille du message sĂ©rialisĂ© en fonction du nombre de nƓuds donne le graphe suivant :

Aussi bien sur cet histogramme que sur les suivants, une barre plus basse correspond systĂ©matiquement Ă  un meilleur rĂ©sultat et l’ordre des barres (de gauche Ă  droite) correspond Ă  celui de la lĂ©gende (de haut en bas).
Sur ce premier graphique, on retrouve un constat du benchmark Java Serializers, mais dans un contexte de message plus complexe : Thrift et protobuf ont des performances trĂšs proches.

Le graphique ci-dessous rapporte leurs rĂ©sultats Ă  ceux de la sĂ©rialisation Java. On constate que leur avantage en termes de taille de message s’amenuise Ă  mesure que l’arbre grossit.

Sur le graphique suivant, on observe que la taille moyenne d’un nƓud dĂ©croĂźt rapidement pour la sĂ©rialisation Java. En effet, le protocole de sĂ©rialisation Java ajoute aux informations du message lui-mĂȘme la description des classes sĂ©rialisĂ©es. Ce surcoĂ»t, important pour un petit message, devient nĂ©gligeable pour des messages constituĂ©s de nombreux objets du mĂȘme type.

Les protocoles de protobuf et Thrift, quant Ă  eux, contiennent trĂšs peu d’information de structure : uniquement un identifiant de champ et un type. Ainsi ils voient la taille moyenne d’un nƓud croĂźtre lĂ©gĂšrement, car les listes d’enfants augmentent en nombre et taille quand l’arbre grossit.

Impact de la taille des objets

Pour ce second test, on fige la structure du message pour mesurer l’influence de la quantitĂ© d’information contenue dans chaque nƓud :

  • Un 1024-tree est considĂ©rĂ© comme dans le test prĂ©cĂ©dent,
  • sa taille est fixĂ©e Ă  31 nƓuds,
  • la taille du champ « description » est utilisĂ© comme variable.


Les résultats concernant la taille du message sont similaires au test précédent, Thrift et protobuf sont trÚs proches et font mieux que la sérialisation Java surtout pour de petits objets.

Figer la structure du message montre que la diffĂ©rence de taille par rapport au protocole de sĂ©rialisation Java est quasi-constante. Ceci est dĂ» au fait que protobuf et Thrift n’apportent aucun gain notable lorsqu’on fait varier la taille de la chaĂźne de caractĂšres.
En effet, les trois protocoles en jeu la sĂ©rialisent sous forme de chaĂźne en UTF8 prĂ©cĂ©dĂ©e de sa longueur. La diffĂ©rence est que le protocole Java utilise 2 octets pour la longueur des chaĂźnes de moins de 2^16 caractĂšres, tandis que les deux frameworks ont recours Ă  un varint. Le saut entre 64 et 128 caractĂšres est dĂ» au fait que le format varint n’utilise qu’un octet pour coder les entiers entre 0 et 127, puis deux de 128 Ă  2^14.

Impact de la structure du message

Pour Ă©valuer l’influence de la structure du message :

  • la description de chaque nƓud est fixĂ©e Ă  32 caractĂšres,
  • le nombre de nƓuds est variable,
  • la cardinalitĂ© des fratries prend trois valeurs : 2, 4 et 1024.

Par exemple, voici les trois variations considĂ©rĂ©es de l’arbre Ă  7 nƓuds :

Le graphique qui suit recense les tailles des messages sérialisés.

Pour tous les protocoles de sérialisation, le comportement est similaire : plus de complexité conduit à un message sérialisé moins compact.
Cela est dû au fait que plus de complexité se traduit par un plus grand nombre de listes de noeuds-enfants. Cependant, la variation reste négligeable (environ 1%) pour Thrift et protobuf.

Le protocole de sĂ©rialisation Java est lui plus fortement influencĂ© (jusqu’Ă  13%). En effet la quantitĂ© d’information utilisĂ©e par les descripteurs de classes est liĂ©e au nombre de types de classes mises en jeu. Plus les fratries sont grandes, moins on utilise de classes diffĂ©rentes. Par exemple, pour 63 nƓuds, le 2-tree utilise toutes les classes de Node0 Ă  Node5, le 4-tree s’arrĂȘte Ă  Node3, et le 1024-tree Ă  Node1.
Le rĂ©sultat particuliĂšrement bon du 2-tree de taille 127 est liĂ© au fait que Node6 n’a pas de liste d’enfants et est donc plus compact que les autres types de Nodes. Dans cet arbre, la majoritĂ© des nƓuds (64) est de type Node6.

Les tailles moyennes par nƓud sont reprĂ©sentĂ©es dans l’histogramme ci-dessous :

L’Ă©volution est conforme aux observations du premier test : l’Ă©cart entre Java et les deux frameworks s’amenuise lorsqu’on augmente la taille du graphe sans pour autant ĂȘtre nĂ©gligeable.

En traçant le gain apporté par les deux frameworks par rapport à la sérialisation Java on obtient :

Par exemple, en considĂ©rant le message du 4-tree Ă  63 nƓuds et un systĂšme devant soutenir une charge de 10000 requĂȘtes/s, le remplacement de la sĂ©rialisation Java par Thrift permet de diminuer le besoin de bande passante de 75.45 Mo/s Ă  40.68Mo/s, soit un gain de 46%.

Conclusion

Cet article a prĂ©sentĂ© une comparaison portant sur la taille de sĂ©rialisation avec des messages complexes. Par rapport au benchmark JVM-serializers, l’avantage de Thrift et protobuf sur la sĂ©rialisation native Java est moins dĂ©cisif en termes de compacitĂ©, mĂȘme s’il reste intĂ©ressant.

La taille du message sĂ©rialisĂ© par Thrift ou Protocol Buffers n’est pas influencĂ©e par la structure mĂȘme du message. C’est surtout son volume qui a un impact : les deux frameworks offrent une sĂ©rialisation bien plus compacte que celle de Java surtout sur de petits messages. Cette observation rejoint le fait que Protocol Buffers n’est pas particuliĂšrement adaptĂ© aux volumes de donnĂ©es importants.

Il faut rappeler qu’employer la sĂ©rialisation native Java comme rĂ©fĂ©rence n’est lĂ©gitime que parce que cet article se limite aux protocoles de sĂ©rialisation. Thrift et Protocol Buffers offrent d’autres avantages tels l’interopĂ©rabilitĂ© avec plusieurs langages et la compatibilitĂ© ascendante et descendante des messages. Ils sont abordĂ©s dans l’article prĂ©cĂ©dent.

Pour aller plus loin, on pourrait analyser les temps de sĂ©rialisation, l’empreinte mĂ©moire, l’intĂ©gration aux processus de build…

Annexes

Voici la déclaration des objets en Thrift IDL : tree.thrift

namespace java com.octo.example.serialization.model.thrift

enum RoomType {
        SINGLE =0,
        DOUBLE =1,
        SUITE =2
}
struct Node6 {
    1: optional i32 number,
    2: optional bool even,
    3: optional double rate,
    4: optional RoomType type,
    5: optional string description,
}
struct Node5 {
    1: optional i32 number,
    2: optional bool even,
    3: optional double rate,
    4: optional RoomType type,
    5: optional string description,
    6: list children,
}
[...]

et ainsi de suite jusqu’au Node0, qui correspond la racine de l’arbre. L’ordre employĂ© Ă©vite le recours Ă  la dĂ©claration avancĂ©e.

Ci-dessous, l’Ă©quivalent en Protocol Buffers language : tree.proto

package serialization;

option java_package = "com.octo.example.serialization.model";
option java_outer_classname = "LimitedTreeProto";

enum RoomType {
    SINGLE =0;
    DOUBLE =1;
    SUITE =2;
}
message Node0 {
    optional int32 number =1;
    optional bool even =2;
    optional double rate =3;
    optional RoomType type =4;
    optional string description = 5;
    repeated Node1 children = 6;
}
[...]
message Node6 {
    optional int32 number =1;
    optional bool even =2;
    optional double rate =3;
    optional RoomType type =4;
    optional string description = 5;
}

L’ordre des nƓuds plus naturel est supportĂ© par le compilateur Protobuf.

Suggestion d'articles :

  1. Sérialisation : Thrift et Protocol Buffers, principes et aperçu
  2. Socle technique des applications Java EE : dans le WAR ou dans le serveur ?
  3. Les nouveautés du langage dans Java 7

Catégories: Blog Société

Open Space OCTO : nouvelle session praticiens agiles le 14 Février

jeu, 01/26/2012 - 15:27

Suite de notre cycle d’ateliers dĂ©diĂ©s aux praticiens agiles, avec une nouvelle session au format Open Space le 14 FĂ©vrier de 14h Ă  18h dans les locaux d’OCTO. 3 bonnes raisons d’y participer :

 

1.Un rendez-vous dédié aux acteurs des DSI :

Le calendrier IT agile est dĂ©jĂ  plutĂŽt chargĂ©, mais il se compose pour majeure partie de rendez-vous rĂ©servĂ©s aux « experts » de l’agile : gourous, coachs, formateurs, etc. Aucun n’est dĂ©diĂ© Ă  ceux qui font au quotidien, c’est Ă  dire aux Ă©quipes internes au sein des DSI. Or Product Owner, ScrumMaster, MOA, Tech Lead, PMO, tous sont confrontĂ©s Ă  des problĂ©matiques rĂ©currentes au sein de leurs projets agiles.

 

2.De nouvelles pistes pour continuer Ă  progresser :

L’objectif des Open Spaces est de partager entre pairs vos questions, vos problĂ©matiques, vos doutes, vos convictions et vos retours d’expĂ©rience :

  • Comment intĂ©grer les Ă©quipes UX ou Webdesign dans le process agile ?
  • Comment donner de la visibilitĂ© Ă  long terme Ă  sa hiĂ©rarchie ?
  • Comment diffuser la culture de l’amĂ©lioration continue ?
  • Comment garantir le pĂ©rennitĂ© des rituels ?
  • Comment mieux coopĂ©rer avec les Ă©quipes d’exploitation ?

AprĂšs plusieurs mois, voire plusieurs annĂ©es de pratiques agiles au sein de ses Ă©quipes, il est primordial de lever de temps en temps la tĂȘte du guidon et de considĂ©rer au-dehors les choix que d’autres ont faits.

 

3.Un support illustré retraçant les échanges :

Comme lors de la premiĂšre session cet automne, VĂ©ronique Olivier-Martin revient pour capter la substantifique moelle de nos Ă©changes et la restituer sous forme d’illustrations sur une fresque murale vĂ©lĂ©da. Chaque participant repartira avec une version numĂ©risĂ©e du croquis d’ensemble retraçant l’évolution des Ă©changes au fil de la session et quelques zooms en bonus sur les croquis les plus percutants !

 

A l’issue de cet atelier, vous aurez pu :

  • Proposer des sujets au coeur de vos problĂ©matiques et les traiter avec vos pairs sous d’autres angles
  • Partager votre propre expĂ©rience d’agiliste sur des questions que se posent d’autres praticiens, au sein d’autres organisations
  • DĂ©couvrir des pratiques agiles, des process et des organisations en place dans d’autres DSI
  • Etendre votre rĂ©seau au sein de la communautĂ© agile

Animateurs :

Christophe Thibaut & Mathieu Gandin : Consultants Seniors et Coachs Agile OCTO

Progamme :

  • 14h : Accueil
  • 14h00-14h15 : proposition des sujets
  • 14h15-17h45 : Open Space ( 2 Ă  3 sessions d’ateliers suivis de restitutions)
  • 17h45-18h : Restitution finale

Cliquez ici pour vous inscrire Ă  l’Open Space du 14 FĂ©vrier

Suggestion d'articles :

  1. Retour sur la premiĂšre session Open Space praticiens agiles
  2. Open Space pour les praticiens agiles le 24 novembre chez OCTO
  3. Open Space « La Pilule Rouge – Comment faciliter la collaboration distante dans nos organisations ? »

Catégories: Blog Société

CR du petit-dĂ©jeuner organisĂ© par OCTO et Quartet FS « L’analyse dĂ©cisionnelle en temps rĂ©el Convergence entre Big Data et Complex Event Processing »

jeu, 01/26/2012 - 11:52

Agenda :

  • Introduction aux enjeux d’analyse de donnĂ©es en temps rĂ©el
  • PrĂ©sentation des architectures d’analyse de donnĂ©es
  • PrĂ©sentation de la solution Open Source ESPER
  • PrĂ©sentation de la solution ActivePivot Sentinel (Quartet FS)
  • Questions/RĂ©ponses

DĂ©finition : « Un systĂšme d’analyse de donnĂ©es temps rĂ©el est un systĂšme Ă©vĂšnementiel disponible, scalable et stable capable de prendre des dĂ©cisions (actions) avec une latence infĂ©rieure Ă  100ms »

100ms est l’ordre de grandeur retenu lorsque l’on parle de « temps rĂ©el ». Cette valeur permet de prendre les dĂ©cisions dans un temps adaptĂ© au business.

Quelles diffĂ©rences avec l’analyse traditionnelle ?

  • Les systĂšmes dĂ©cisionnels sont construits sur des mĂ©canismes qui imposent la duplication des donnĂ©es
 donc avec un temps de latence importants.
  • Notion de reporting opĂ©rationnel c’est Ă  dire sur des donnĂ©es vivantes : on dĂ©passe rapidement les 1000 TPS (transactions par secondes), ce qui est une limite au-delĂ  de laquelle la latence des SGBDR explose (source : TPC.org).
  • La prise de dĂ©cision ne peut pas ĂȘtre prise dans la zone de stockage Ă  cause de la latence, mais doit l’ĂȘtre idĂ©alement en amont (Ă  l’extĂ©rieur) pour une meilleure rĂ©activitĂ©.

Quels intĂ©rĂȘts pour les entreprises ?

Les entreprises sont dĂ©jĂ  aujourd’hui confrontĂ©es aux problĂ©matiques de volumĂ©trie. A cela s’y ajoute 3 nouveaux facteurs majeurs entraĂźnant toujours plus de donnĂ©es dans nos systĂšmes :

  • Une multiplication des appareils connectĂ©s, entraĂźnant une augmentation des Ă©vĂšnements qui devront ĂȘtre traitĂ©s, et l’augmentation des sources d’évĂšnements
  • Une fusion des poches d’utilisateurs et une augmentation de leur nombre.
  • Une forte volatilitĂ© du trafic (pic de connexion / utilisation) qui suit le rythme du mĂ©tier (ex : saisonnalitĂ©s dans le e-Commerce).

Pourquoi CEP ?

DĂ©finition : Le  Complex Event Processing (CEP) est une technique permettant de manipuler des Ă©vĂ©nements au fur et Ă  mesure de leur prise en compte, d’identifier des relations entre ces Ă©vĂ©nements (corrĂ©lation, causalitĂ©, patterns), et d’en tirer de l’information sous forme de nouveaux Ă©vĂ©nements dits « dĂ©rivĂ©s » ou « complexes ».

Le CEP apparaĂźt ĂȘtre une opportunitĂ© pour l’analyse et la prise de dĂ©cision en temps rĂ©el lĂ  ou mĂȘme le stockage sur cache/grille de donnĂ©es seul peut montrer ses limites :

  • la synchronisation cache/stock sur disque devient un problĂšme sur de gros volumes de donnĂ©es
  • Le dĂ©cisionnel implique des requĂȘtes complexes sur des volumes de donnĂ©es importants

Pourquoi faire converger Big Data et CEP ?

  • Pour mieux tirer profit de l’augmentation des volumes de donnĂ©es : les SI ont besoin d’infos de plus en plus dĂ©taillĂ©es.
  • Pour permettre des analyses de plus en plus complexes (systĂšmes de scoring, dĂ©tection de comportement, machine learning
).
  • Pour traiter efficacement de nouvelles sources de donnĂ©es (sociales, peu structurĂ©es
)
  • Pour permettre, et c’est un point fondamental, de faire des expĂ©rimentations (ie. pouvoir interroger le systĂšme, dĂ©couvrir de nouvelles rĂšgles, les tester, les mettre en place et les adapter si besoin).

L’intĂ©rĂȘt principal du CEP rĂ©side dans le traitement en mĂ©moire de l’évĂ©nement avant son stockage, afin de conserver une forte rĂ©activitĂ©.

DĂ©tails sur l’analyse en temps rĂ©el :

  • Traitement Ă©vĂšnementiel Ă  faible latence
  • Traitement en mĂ©moire
  • FonctionnalitĂ©s de traitement des Ă©vĂšnements (jointure de flux corrĂ©lĂ©s, pattern matching, rĂšgles)
  • Historisation des Ă©vĂšnements traitĂ©s
  • Simulation sur des donnĂ©es historiques (backtesting)
  • Des IHM sont prĂ©sentes et rĂ©pondent aux questions des donnĂ©es historiques et des donnĂ©es en temps rĂ©el (que s’est-il passĂ©/que se passe-t-il ?). Permet de visualiser et d’explorer les donnĂ©es
  • Il existe des IHM d’édition des rĂšgles utilisable directement par les mĂ©tier / les analystes et sans besoin de dĂ©veloppements particuliers.

Enjeux de l’analyse en temps rĂ©el :

  • Latence
  • DĂ©bit
  • Consommation de mĂ©moire
  • RĂ©partition sur plusieurs nƓuds
  • Reprise sur panne
  • Initialisation Ă  partir de l’historique
  • Richesse des interfaces pour l’analyse des donnĂ©es temps-rĂ©el et historique
  • PossibilitĂ© de modifier facilement les rĂšgles d’analyse et de les valider rapidement

L’approche peut se faire par :

  • des outils de pur CEP : (ex : Streambase, Tibco Business Events, Microsoft StreamInsight, ESPER
) : particuliĂšrement performants sur l’analyse des Ă©vĂšnements sur des Ă©chelles de temps courtes, il faudra leur adjoindre des systĂšmes de stockage des donnĂ©es historiques, et d’IHM Ă©voluĂ©e
  • des outils de datagrid : (ex : SQLFire, GigaSpaces) : trĂšs adaptĂ© au stockage Ă  fort dĂ©bit d’écriture, et fournissant des possibilitĂ©s de traitement des donnĂ©es Ă  chaud (type trigger), ces outils devront ĂȘtre secondĂ©s d’IHM Ă©voluĂ©es pour rĂ©pondre au besoin
  • des outils OLAP en mĂ©moire : (ex QuartetFS) : outils trĂšs adaptĂ©s au cas des analyses multidimensionnelles en temps-rĂ©el
DĂ©mo ESPER (moteur CEP Java) : nous ne sommes pas en mesure de vous proposer les vidĂ©os aujourd’hui ; nous vous proposons de retrouver les dĂ©mos en vidĂ©os plus tard.

DĂ©mo ActivePivot Sentinel : nous ne sommes pas en mesure de vous proposer les vidĂ©os aujourd’hui ; nous vous proposons de retrouver les dĂ©mos en vidĂ©os plus tard.

Suggestion d'articles :

  1. L’analyse dĂ©cisionnelle en temps rĂ©el Convergence entre Big Data et Complex Event Processing
  2. OCTO organise un petit-dĂ©jeuner sur le thĂšme « Usability » le 09 octobre Ă  Paris
  3. Vidéo du petit-déjeuner « Comment bùtir votre Cloud ? » organisé par OCTO Technology

Catégories: Blog Société

Génial ! Vous avez encore 6 jours pour proposer votre session !

mer, 01/25/2012 - 09:52

Une date à retenir ? Oui !  Le mardi 31/01/2012 pour nous faire part de vos idées sur les sujets IT, techniques, métiers ou liés aux aspects managériaux de la DSI !

Pas d’idĂ©e de session ? Aucun problĂšme ! Vous pouvez élire votre session prĂ©fĂ©rĂ©e en votant pour elle !  D’ailleurs vous pouvez aussi la partager  pour augmenter le nombre de vote !

Pour rappel : la qualitĂ© du rĂ©sumĂ© de session proposé (fond et forme) sera le critĂšre de sĂ©lection principal pour l’Ă©quipe USI. Merci donc d’en tenir compte lors du remplissage de ce formulaire.

L’équipe programme Ă©tudiera toutes les propositions et sĂ©lectionnera les sessions qui lui paraĂźtront les plus intĂ©ressantes. Vous serez peut-ĂȘtre invitĂ© Ă  venir prĂ©senter votre session lors d’une journĂ©e dĂ©diĂ©e : mi fĂ©vrier et nous informerons de notre dĂ©cision finale fin mars 2012.

Cliquez ici pour soumettre votre session à l’USI

On attend vos candidatures avec impatience !

 

Suggestion d'articles :

  1. Appel Ă  candidature : proposez votre session Ă  USI 2012 !
  2. Avez vous la culture Cloud ? sur tv4it.net
  3. Derniers jours pour profiter de votre place USI 2011 Ă  -20%, les 28&29 juin prochains !

Catégories: Blog Société

Petit-dĂ©jeuner OCTO – L’agilitĂ© Ă  grande Ă©chelle : Retour d’experience avec Strator

lun, 01/23/2012 - 14:35

OCTO organise le mardi 07 fĂ©vrier 2012 Ă  partir de 8h45 un petit-dĂ©jeuner gratuit, aux Salons Wagram  « L’agilitĂ© Ă  grande Ă©chelle » : retour d’expĂ©rience en partenariat avec Strator.

 

Un projet de développement logiciel impliquant 80 personnes, distribuées sur 9 équipes réparties dans 4 pays.
Un produit devant soutenir une activité de plus de 5 000 000 de transactions de vente par jour.
Une premiĂšre mise en production au bout de 6 mois.
Et de nouvelles fonctionnalités tous les deux mois.

 

Qui a dit que l’agile n’était pas adaptĂ© aux gros projets ?

Strator et OCTO Technology se proposent de partager avec vous un retour d’expĂ©rience sur la mise en place de mĂ©thodes agiles Ă  large Ă©chelle : feature-teams, communautĂ©s de pratique, interactions avec des Ă©quipes off-shore, livraisons frĂ©quentes et mises en production par un simple clic, prise de dĂ©cisions collaboratives…

A l’issue de ce sĂ©minaire nous aurons partagĂ© avec vous :

  • Nos Do’s & Don’t Ă  propos des mĂ©thodes agiles lorsqu’elles sont appliquĂ©es Ă  de gros projets
  • Les modĂšles d’organisation que nous avons mis en oeuvre
  • Nos meilleures pratiques pour diriger des Ă©quipes projets gĂ©ographiquement distribuĂ©es
  • Les outils et les compĂ©tences clĂ©s pour dĂ©marrer un tel projet

 

Ce petit-dĂ©jeuner s’adresse aux :

  • DSI
  • Chefs de projets
  • Responsables Innovation / e-business / Internet
  • Responsables MOA / MOE
  • Architectes

 

Intervenant(s) :
Philippe Chevalier – Strator, Directeur Technique
HervĂ© Lourdin – OCTO, Delivery Manager
Mathieu Despriee – OCTO, Manager

 

Ce petit-déjeuner est à destination de nos clients et prospects en priorité.

Cliquez ici pour vous inscrire au petit-déjeuner : Agilité

Suggestion d'articles :

  1. Vidéo du petit-déjeuner « Comment bùtir votre Cloud ? » organisé par OCTO Technology
  2. OCTO organise un petit-dĂ©jeuner Gestion des IdentitĂ©s le 27 janvier – TĂ©moignage d’Air Liquide
  3. OCTO organise un petit-dĂ©jeuner sur l’agilitĂ©, jeudi 12 novembre

Catégories: Blog Société

Apéro Agile, le retour !

mar, 01/17/2012 - 17:34

 

Pour la troisiÚme fois cette semaine, Edouard, votre Product Owner, vous a demandé sur quoi vous pouviez vous engager pour cette itération ?

Vous souhaitez annoncer à Sophie du Marketing dans combien de temps votre fonctionnalité principale sera réalisée, mais vos indicateurs actuels vous donnent le vertige ?

Lors du sprint planning, 10 Ă©crans ont dĂ» ĂȘtre estimĂ©s. Vous ĂȘtes dubitatif : quel Ă©cran doit porter le coĂ»t de dĂ©veloppement du premier ?

Dans un autre registre, vous démarrez un projet Agile sur un lourd existant. Comment concilier le manque de tests unitaire avec des itérations rapides ?

L’équipe mainframe n’est pas Agile, et demande des commandes trois mois Ă  l’avance. Est il possible de faire de l’Agile dans ces conditions ?

Je suis manager. Avant, je rĂ©digeais des plannings, et j’attribuais des tĂąches Ă  chacun. Quel sera mon rĂŽle dans la nouvelle organisation ?

Vous avez envie d’en parler, venez le mardi 31 janvier Ă  l’ApĂ©ro Agile dans les locaux d’OCTO !

Autours d’un verre, nous discuterons de pilotage, d’intĂ©ractions avec des projets non agiles, ainsi que de postes et de carriĂšre. Nous parlerons de pratiques, de techniques, et de vos rĂ©ussites.

Que vos Ă©quipes soient dĂ©jĂ  Agiles, que vous soyez vous mĂȘme praticien de longue date, ou que vous souhaitiez vous mettre Ă  l’Agile prochainement, venez partager avec d’autres pratiquants vos problĂšmes du quotidien afin de les rĂ©soudre ensemble.

L’inscription est ouverte aux 20 premiers : http://aperoagile2.eventbrite.com/

Edit : Je suis impressionnĂ© ! Les 20 places sont parties en une soirĂ©e ! Du coup, j’ai ouvert une liste d’attente. Inscrivez vous si vous le souhaitez, vous serez contactĂ©s en cas de dĂ©sistement.

Catégories: Blog Société

Kinect, I mock you so much

mar, 01/17/2012 - 11:50

DerriĂšre cette formulation humoristique se cache un des fondements de l’industrialisation des dĂ©veloppements : le fait de pouvoir tester de maniĂšre automatisĂ©e tout ou partie d’un systĂšme informatique.

Aussi bien dans les architectures complexes que dans les applications les plus simples, il est pertinent de pouvoir tester un composant logiciel unitairement (indĂ©pendamment des autres composants duquel il dĂ©pend) : les dĂ©pendances sont donc « mockĂ©es » ou simulĂ©es en français.

Il est aussi nécessaire de pouvoir créer un contexte favorable au scénario de test en injectant un jeu de données particulier via un automate de tests ou un injecteur.

Le dĂ©veloppement d’applications Kinect n’échappe pas Ă  cette nĂ©cessitĂ©. Voici comment simuler une Kinect avec la librairie MocKinect.

Ras la Kinect

Pour rappel, la Kinect est un pĂ©riphĂ©rique composĂ© de capteurs optiques (video couleur et infrarouge) permettant de capturer une vue en relief des Ă©lĂ©ments entrant dans son champ de vision. Le SDK (kit de dĂ©veloppement) Kinect intĂšgre une fonctionnalitĂ© d’analyse de l’image et de reconnaissance de forme humaine qui gĂ©nĂšre un « pseudo-squelette ».

Capture des flux venant des capteurs
Flux video
Flux video
Flux profondeur
Flux infrarouge
Squelette détecté
Squelette reconnu

Pour plus d’informations sur le fonctionnement de la Kinect, consultez l’article Kinect : un tour d’horizon tout naturellement.

La dĂ©tection de mouvement se basant sur des seuils et des distances, il faut souvent travailler par ajustements successifs. Tester un scĂ©nario d’utilisation Kinect est d’autant plus long et fastidieux pour un dĂ©veloppeur qu’il lui faut :

  • Ajuster le code et lancer l’application
  • Se lever et se mettre en position face Ă  la Kinect
  • Effectuer le ou les mouvements
  • (Ă©ventuellement se rendre compte qu’il a oubliĂ© d’enlever un breakpoint dans le code)
  • VĂ©rifier le comportement de l’application
  • Constater le bogue
  • S’asseoir
  • Ajuster le code puis lancer l’application
  • Se lever et se mettre en position face Ă  la Kinect
  • Et ainsi de suite


MĂȘme si ce type d’exercice est bon pour la santĂ©, cela ne vaut pas une activitĂ© sportive au grand air et cela impacte fortement la productivitĂ©.

Avec MocKinect, je m’en mock de la Kinect

Pour faciliter mon travail, j’ai dĂ©veloppĂ© la librairie MocKinect (http://mockinect.codeplex.com/) qui contrairement Ă  son nom n’est pas un mock mais un injecteur (on ne peut pas toujours rĂ©sister Ă  un mot-valise).

MocKinect permet d’enregistrer les flux bruts venant des capteurs de la Kinect et de le stocker pour les rejouer ultĂ©rieurement.
La librairie s’utilise en deux temps :

  • Se lever et s’enregistrer en train de faire les gestes qui devront ĂȘtre utilisĂ©s dans l’application
  • S’asseoir pour coder et tester en rejouant la scĂšne enregistrĂ©e autant de fois que nĂ©cessaire

Une fois les enregistrements effectuĂ©s, il est possible d’utiliser MocKinect SANS Kinect. Vous pouvez ainsi intĂ©grer les tests Kinect dans une usine d’intĂ©gration continue et mĂȘme contrĂŽler leur exĂ©cution avec des outils de tests fonctionnels tels que FitNesse ou GreenPepper.

MocKonception

Pour favoriser l’utilisation de cette librairie, j’ai voulu limiter les freins inhĂ©rents Ă  l’intĂ©gration de nouveaux frameworks en suivant ces deux principes :

  • Avoir un coĂ»t d’intĂ©gration quasi nul sur le code de l’application
  • Avoir un impact minimum sur les performances en exĂ©cution

Pour cela, j’ai optĂ© pour une solution utilisant l’encapsulation. MocKinect est donc composĂ© d’un ensemble de classes reprenant les prototypes des classes du SDK Kinect de Microsoft. Pour l’utiliser, il suffit de remplacer la directive d’inclusion du SDK par celle de MocKinect.

Remplacez:

1
using Microsoft.Research.Kinect ;

Par:

1
using MocKinect;

Le dĂ©clenchement d’un enregistrement ou d’une injection s’effectue par l’appel Ă  la mĂ©thode SetMode.

1
2
3
// Mode proxy
kinectRuntime.SetMode(MocKinectMode.Reality);
// L'application reçoit les informations issues des capteurs de la Kinect
1
2
3
4
// Enregistrement
kinectRuntime.SetMode(MocKinectMode.Record, "SwipeGesture");
// L'application reçoit les informations issues des capteurs de la Kinect
// Ces informations sont en mĂȘme temps enregistrĂ©es dans le fichier SwipeGesture
1
2
3
4
// Injection
kinectRuntime.SetMode(MocKinectMode.Replay, "PinchGesture");
// La véritable Kinect est désactivée
// Les flux précédemment enregistrés dans le fichier PinchGesture sont lus et injecter dans l'application

L’impact sur les performances est assez faible et peut ĂȘtre rĂ©duit en optimisant la gestion du tampon (buffer) d’enregistrement des flux. Une application recevant 25 images Kinect par seconde peut voir ce dĂ©bit rĂ©duit Ă  20 images par seconde en utilisant MocKinect.

Appel Ă  MocKontribution

MocKinect est encore en version bĂȘta et beaucoup de fonctionnalitĂ©s peuvent ĂȘtre rajoutĂ©es pour amĂ©liorer la productivitĂ© des dĂ©veloppeurs d’applications Kinect.
Parmi celles-ci :

  • Mocker plusieurs Kinects simultanĂ©ment
  • GĂ©rer l’enregistrement et l’injection des donnĂ©es de squelettes
  • Compresser les donnĂ©es issues de l’enregistrement
  • AmĂ©liorer la compatibilitĂ© avec les modes Ă©vĂšnementiels et par Ă©chantillonnage

N’hĂ©sitez pas Ă  partager vos recommandations ou m’indiquer votre envie d’ĂȘtre contributeur afin de mener ce projet à bien.

Dans la mĂȘme veine, la Kinect Toolbox de David Catuhe permet d’enregistrer/rejouer un squelette et fournit de plus un socle de reconnaissance de mouvements (Gestures)

Kinews de derniĂšre minute

Au moment de l’Ă©criture de cet article, Microsoft a annoncé la sortie officielle de la Kinect For Windows. Ce pĂ©riphĂ©rique est similaire Ă  la Kinect pour Xbox mais sera dĂ©diĂ© Ă  un usage PC. Cette nouvelle Kinect apportera un gain de performance et de prĂ©cision, elle pourra gĂ©rer le « near-mode » (objet Ă  50 cm des capteurs). Son SDK intĂ©grera la reconnaissance de mouvements types et permettra probablement la dĂ©tection prĂ©cise des doigts de la main.
Rendez-vous le 1er février lors de la mise sur le marché de ce nouveau périphérique et les 7-8-9 février pour la conférence Microsoft TechDays.

Suggestion d'articles :

  1. Kinect: un tour d’horizon tout naturellement
  2. Quoi de neuf avec la Kinect ?

Catégories: Blog Société

Le push web avec Pusher

mar, 01/17/2012 - 10:27
Introduction

Depuis que les sites web sont devenus des applications riches, le besoin de push s’est largement manifestĂ©. Il est prĂ©sent sur des sites de mails, de feeds d’information, de partage de documents, de rĂ©servation de billets avec choix des places
 Le push web permet de notifier le client d’une certaine information directement depuis le serveur, sans nĂ©cessiter de recharger la page du client. C’est typiquement un paradigme qu’on peut utiliser sur un site de messagerie instantanĂ©e.

Plusieurs technologies permettent d’implĂ©menter ce genre de comportement, les plus connues Ă©tant probablement les WebSockets, les server-sent events (tous deux inclus dans les spĂ©cifications HTML5), ou encore le long polling, du web pull simulant du web push, utile sur certains navigateurs des moins rĂ©cents.

Pusher Le produit

Un précédent article posté sur ce blog présentait le push web implémenté avec Diffusion (article en 2 parties). Nous allons présenter dans cet article une autre solution reposant sur la technologie WebSockets : Pusher.

Pusher se compose d’une API dĂ©veloppĂ©e pour plusieurs langages (Ruby, Ruby on Rails, PHP, et ASP .Net) et d’une Infrastructure as a Service hĂ©bergĂ©e sur Amazon EC2, ce qui lui confĂšre une scalabilitĂ© apprĂ©ciable. Toute l’infrastructure gĂ©rant les connexions WebSockets et les canaux cĂŽtĂ© serveur est implĂ©mentĂ©e par la plateforme cloud Pusher. Il se distigue en cela d’autres frameworks tels socket.io qui implĂ©mentent uniquement la technologie WebSocket avec de nombreux fallbacks en cas d’incompatibilitĂ©, mais laissent la main Ă  l’utilisateur sur la mise en place de l’infrastructure.

D’autre part, la PaaS Heroku ne supportant pas la technologie WebSocket, Pusher propose un add-on permettant son utilisation sur la plateforme de dĂ©ploiement.

Mise en pratique Canal Public

Sans plus attendre, passons Ă  la pratique en mettant en place un site de messagerie instantanĂ©e, illustration typique de push web. Cet exemple permettra Ă  la fois de transmettre des messages Ă  tous les utilisateurs connectĂ©s, mais aussi d’afficher la liste de tous les utilisateurs prĂ©sents. La comprĂ©hension de cette article implique des connaissances basiques en Ruby on Rails et en javascript, notamment jQuery. Vous pouvez d’ores et dĂ©jĂ  trouver une dĂ©monstration de l’application finale ici (attention, rendu minimaliste !). Les credentials Ă  utiliser sont test@pusher-chat-example.com/tester et test2@pusher-chat-example.com/tester. Tout le code est disponible sur github.

Au prĂ©alable, nous avons dĂ©jĂ  mis en place un site dĂ©veloppĂ© en Ruby on Rails, dĂ©ployĂ© sur Heroku, et Ă©quipĂ© de l’add-on Pusher. La librairie javascript jQuery est Ă©galement ajoutĂ©e au projet. Enfin, le projet est configurĂ© pour utiliser la gem pusher.

Le site dispose d’une page d’accueil et  d’une page d’authentification. Tout utilisateur accĂ©dant Ă  la page d’accueil est dĂ©jĂ  authentifiĂ©. La page d’accueil sera celle oĂč nous crĂ©erons le service de messagerie instantanĂ©e.

Pour commencer, nous devons inclure dans notre page le fichier de l’API javascript de Pusher. On ajoute donc la ligne suivante dans le fichier html de la page d’accueil.

index.html.erb :

<%= javascript_include_tag "http://js.pusher.com/1.11/pusher.min.js" %>

Lors de l’ajout de l’add-on pusher depuis Heroku, un compte Pusher nous a Ă©tĂ© attribuĂ©.  Depuis ce compte, nous pouvons rĂ©cupĂ©rer des informations d’identification pour le dĂ©veloppement et pour la production. Ajoutons ces informations dans les fichiers appropriĂ©s :

config/environments/development.rb :

Pusher.app_id =  '13342'
Pusher.key    = 'd8d6a55bc5e7ffb81f0e'
Pusher.secret = 'my-development-secret-key'

config/environments/production.rb :

Pusher.app_id = '13341'
Pusher.key    = '6c786501a9b463e4465d'
Pusher.secret = 'my-production-secret-key'

Notre projet est Ă  prĂ©sent correctement paramĂ©trĂ© pour utiliser Pusher. Nous pouvons dĂ©sormais crĂ©er une fonction javascript d’initialisation qui s’abonne Ă  un canal de push que l’on appelle « instant-messaging-channel » et ouvre une connexion sur ce canal vers la plateforme cloud de Pusher. L’application est identifiĂ©e auprĂšs de Pusher par l’API key. La fonction d’initialisation est appelĂ©e au chargement de la page.

application.js :

function subscribeToPush() {
  var pusher = new Pusher('d8d6a55bc5e7ffb81f0e');
  var channel = pusher.subscribe('instant-messaging-channel');
}

Pour l’instant, la clĂ© de l’API est Ă©crite en dur dans le code.

D’autre part, cĂŽtĂ© html, nous ajoutons un formulaire depuis lequel nous pourrons poster un nouveau message aux destinataires, ainsi qu’un peu de code « cosmĂ©tique ».

index.html.erb :

<h1>Messagerie Instantanée</h1>
<div id="instant-messaging" data-pusher-key="<%=Pusher.key%>">
  <%= form_tag "home/send_message", :remote => true do %>
    <%= text_field_tag "message" %>
    <%= submit_tag "Envoyer" %>
  <% end %>
</div>

On constate qu’un attribut data de la balise div permet de communiquer la clĂ© de l’API Pusher au javascript. Cela nous permet de rĂ©cupĂ©rer la clĂ© de dĂ©veloppement ou de production via jQuery. On peut ainsi modifier la fonction javascript comme suit.

application.js :

function subscribeToPush() {
  var pusher = new Pusher(jQuery('#instant-messaging').attr('data-pusher-key'));
  var channel = pusher.subscribe('instant-messaging-channel');
}

Lorsqu’on poste un nouveau message par le formulaire, on souhaite maintenant qu’il soit diffusĂ© sur  le canal et dispatchĂ© entre les diffĂ©rents abonnĂ©s du canal. L’action appelĂ©e par la soumission du formulaire est l’action send_message du contrĂŽleur home. Dans cette action, on rĂ©cupĂšre le contenu du message postĂ© par le formulaire, et on le diffuse sur le canal « instant-messaging-channel ». On dĂ©finit l’évĂšnement que l’on souhaite diffuser Ă  travers ce canal comme du type « new-message ». Les donnĂ©es associĂ©es Ă  l’Ă©vĂšnement envoyĂ© sont un hash qui contient ici le message postĂ© avec :message comme clĂ©. On rĂ©pond ensuite par un header http de code 200.

home_controller.rb :

def send_message
  message = params[:message]
  Pusher['instant-messaging-channel'].trigger('new-message', {:message => message}) unless message.blank?
  head :ok
end

Ca n’est pas encore visualisable, mais croyez moi sur parole, nous diffusons Ă  prĂ©sent un Ă©vĂšnement sur notre canal « instant-messaging-channel » chaque fois que nous cliquons sur le bouton d’envoi, et tous les abonnĂ©s de ce canal le reçoivent. L’évĂšnement, comme l’indique le schĂ©ma prĂ©sentĂ© plus haut, est envoyĂ© depuis le serveur de l’application (en l’occurrence, le serveur Heroku) vers la plateforme Pusher. Cette derniĂšre le redistribue alors vers tous les clients ayant ouvert une connexion avec la mĂȘme clĂ© d’API Pusher et le mĂȘme nom de canal.

Il nous reste maintenant Ă  capter l’évĂšnement poussĂ© sur le client et Ă  le traiter. Pour cela, nous allons ajouter un callback Ă  notre canal. Celui-ci sera appelĂ© chaque fois qu’un Ă©vĂšnement de type « new-message » sera poussĂ© sur le canal « instant-messaging-channel ». Nous utiliserons pour ça la fonction bind() de l’API javascript de Pusher. Dans notre application de messagerie instantanĂ©e simple, le traitement du callback sera de rĂ©cupĂ©rer les donnĂ©es associĂ©es Ă  l’évĂ©nement, c’est-Ă -dire le hash envoyĂ© depuis le contrĂŽleur, et de les afficher les uns Ă  la suite des autres. Donc, dans notre mĂ©thode d’abonnement au canal, nous ajoutons les lignes ci-dessous.

application.js :

function subscribeToPush() {
  var pusher = new Pusher(jQuery('#instant-messaging').attr('data-pusher-key'));
  var channel = pusher.subscribe('instant-messaging-channel');
  channel.bind('new-message', function(data) {
    jQuery('#instant-messaging').append(data.message + "<br />");
  });
}

Et voilà ! comme disent les amĂ©ricains. Vous avez Ă  prĂ©sent une application de messagerie instantanĂ©e, minimaliste certes, mais fonctionnelle. Pour la tester en local, il suffit de s’y connecter depuis plusieurs navigateurs diffĂ©rents. Nous pourrions Ă  prĂ©sent ajouter devant chaque message l’e-mail de son auteur trĂšs facilement. Il suffirait d’ajouter la paire clĂ©/valeur e-mail dans les donnĂ©es associĂ©es Ă  l’évĂ©nement « new-message » lors de son envoi, et de rĂ©cupĂ©rer ce nouveau paramĂštre Ă  la rĂ©ception de l’évĂ©nement pour l’afficher Ă  l’endroit qui convient. Le canal utilisĂ© ici est un canal dit public, et son principe reste trĂšs simple.

Canal Présence

Nous allons Ă  prĂ©sent voir comment connaĂźtre en temps rĂ©el la liste des diffĂ©rents utilisateurs connectĂ©s au service de messagerie en utilisant un canal de prĂ©sence. Le principe ici est globalement similaire Ă  celui du canal public, mais il s’en distingue par quelques subtilitĂ©s ayant leur importance.

L’idĂ©e est la suivante. Lorsqu’un client se connecte Ă  Pusher, un token unique pour l’utilisateur et l’application est gĂ©nĂ©rĂ© et lui est attribuĂ©. Lorsque ce mĂȘme client souhaite s’abonner Ă  un canal de prĂ©sence (ou Ă  un canal privĂ©, dont le fonctionnement est sensiblement identique), l’API envoie d’abord une requĂȘte au serveur de l’application pour savoir si l’accĂšs lui est autorisĂ©. Le serveur peut dĂ©terminer l’autorisation d’accĂšs grĂące au nom du canal qui est transmis en paramĂštre. Le cas Ă©chĂ©ant, le service d’autorisation retourne avant tout une clĂ© d’authentification. Cette clĂ© permettra ensuite Ă  Pusher de dĂ©terminer que l’utilisateur a bien accĂšs au canal. D’autre part, le service retourne Ă©galement certaines informations concernant l’utilisateur : un id obligatoire, d’une part, et toutes les informations que l’on souhaiterait voir transiter dans le canal de prĂ©sence d’autre part (e-mail, statut, IP,
). Le message ainsi retournĂ© ressemble Ă  cela :

{"auth" => "d8d6a55bc5e7ffb81f0e:0d355103f73ba4de6a6f56975d3261bcea", "channel_data" => "{"user_id":4, "user_info":{"email":"mark.zuckerberg@gmail.com", "ip":"127.0.0.1"}}"}

Le schéma suivant illustre ce processus :

Maintenant que le principe est clair, passons Ă  la pratique. On va donc commencer par dĂ©finir auprĂšs de l’API Pusher l’url sur laquelle il doit authentifier l’utilisateur. On ajoute dans la mĂ©thode subscribeToPush() :

application.js :

Pusher.channel_auth_endpoint = 'home/authenticate'

On demande ensuite un abonnement au canal prĂ©sence (dont l’identifiant doit impĂ©rativement commencer par ‘presence’) :

applicaton.js :

var presence_channel = pusher.subscribe('presence-instant-messaging-channel');

Mais toute tentative d’abonnement Ă  ce canal fera appel au service d’authentification que nous n’avons pas encore implĂ©mentĂ©. Il faut donc ajouter l’action authenticate dans le contrĂŽleur home.

def authenticate
  if user_signed_in?
    response = Pusher[params[:channel_name]].authenticate(params[:socket_id], {:user_id => current_user.id, :user_info => { :email => current_user.email}})
    render :json => response
  else
    render :text => "Not authorized", :status => '403'
  end
end

Ici, nous vĂ©rifions simplement que l’utilisateur s’est bien connectĂ© au site, mais les contrĂŽles pourraient ĂȘtre plus poussĂ©s et personnalisĂ©s, puisque l’identifiant du canal (« presence-instant-messaging-channel ») est passĂ© dans les paramĂštres. La seule information pertinente que nous souhaitons envoyer Ă  propos de l’utilisateur est son e-mail.

Les canaux de présence répondent par défaut à 4 évÚnements déclenchés par Pusher :

  • « pusher:subscription_succeeded » : envoyĂ© quand l’abonnement a rĂ©ussi. Une liste d’informations des membres connectĂ©s Ă  ce mĂȘme canal est envoyĂ©e conjointement Ă  l’évĂšnement.
  • « pusher:subscription_error » : envoyĂ© si une erreur est survenue pendant l’abonnement. Le code http de l’erreur est associĂ© Ă  l’évĂ©nement.
  • « pusher:member_added » : envoyĂ© lorsqu’un nouveau membre s’abonne au canal. Les informations du membre sont envoyĂ©es conjointement Ă  l’évĂ©nement.
  • « pusher:member_removed » : envoyĂ© lorsqu’un utilisateur s’est dĂ©sabonnĂ© du canal. Les informations du membre sont envoyĂ©es conjointement Ă  l’évĂ©nement.

Dans les Ă©vĂšnements dĂ©crits ci-dessus, les informations associĂ©es aux membres sont celles-lĂ  mĂȘmes que l’on renvoie dans le service d’authentification.

Dans le cadre de notre application de messagerie instantanĂ©e, nous souhaitons afficher en temps rĂ©el la liste des utilisateurs prĂ©sents sur le chat. Pour ĂȘtre Ă  jour dans le liste, nous devons donc Ă©couter les Ă©vĂšnements « pusher:subscription_succeeded », « pusher:member_added » et « pusher:member_removed ».

CÎté javascript, nous ajoutons donc les bind() suivants sur ces évÚnements :

application.js :

presence_channel.bind('pusher:subscription_succeeded', function(members){
  members.each(function(member) {
    jQuery('#members-list').append("<div id='member_" + member.id + "'>" + member.info.email + "</div><br />");
  });
});

presence_channel.bind('pusher:member_added', function(member) {
  jQuery('#members-list').append("<div id='member_" + member.id + "'>" + member.info.email + "</div><br />");
});

presence_channel.bind('pusher:member_removed', function(member) {
  jQuery('#member_' + member.id).remove();
});

CĂŽtĂ© html, nous crĂ©ons un div d’identifiant « members-list » destinĂ© Ă  accueillir les e-mails des utilisateurs connectĂ©s.

Ainsi, Ă  l’établissement de l’abonnement au canal de prĂ©sence, nous rĂ©cupĂ©rons la liste des utilisateurs dĂ©jĂ  prĂ©sents, et affichons leurs e-mails. D’autre part, chaque fois qu’un utilisateur s’abonne ou se dĂ©sabonne, nous ajoutons ou retirons son e-mail de la liste.

Limitations

Comme on vient de le voir le service de push web proposé par Pusher permet de mettre en place la technologie WebSocket au sein de son application de façon simple, rapide, et sécurisée si nécessaire. Cependant, Pusher souffre de quelques limitations.

Tout d’abord, si le protocole WebSocket est Ă  prĂ©sent largement supportĂ© par les navigateurs rĂ©cents, ce n’est pas le cas pour tous (voir ici la liste des navigateurs supportant le protocole). De plus, mĂȘme si certaines anciennes versions de browsers sont compatibles, elles dĂ©sactivent par dĂ©faut le support WebSockets Ă  cause d’une faille de sĂ©curitĂ© (dĂ©crite ici) antĂ©rieure Ă  l’actuelle spĂ©cification du protocole. Heureusement, Pusher, dans son infinie sagesse, a automatiquement recours Ă  un workaround dans le cas des navigateurs incompatibles. En effet, l’API fait alors appel Ă  une Ă©mulation de WebSocket en Flash. Ici encore, cela impose qu’un plugin Flash soit installĂ© sur le navigateur. Si ces limitations peuvent prĂ©senter un problĂšme sur certaines infrastructures vieillissantes, elles sont toutefois vouĂ©es Ă  disparaĂźtre.

De mĂȘme, toujours en relation avec la technologie WebSocket, celle-ci peut connaĂźtre des dysfonctionnements si la connexion passe par un proxy. En effet, celui-ci, si il est configurĂ© dans ce sens, peut parfois interrompre la connexion Ă©tablie et empĂȘcher le bon dĂ©roulement du push.

Ensuite, comme tous les services hĂ©bergĂ©s sur le cloud, tous vos messages passeront par Pusher, avec les craintes de confidentialitĂ© que ça peut susciter. Cette inquiĂ©tude est inhĂ©rente au cloud, et rien n’empĂȘche de chiffrer ses messages avant de les transmettre. Il existe d’ailleurs une alternative Ă  la plateforme Pusher avec le projet open source Slanger qui implĂ©mente le mĂȘme protocole et permet d’internaliser la transmissions des messages WebSockets.

Enfin, Pusher est bien entendu payant si l’on va au-delà du simple test. Il propose plusieurs programmes allant de 19$/mois pour 100 connexions concurrentes et 200 000 messages/jour jusqu’à 199$/mois pour 5000 connexions concurrentes et 10 millions de messages/jour. La version de test permet toutefois de s’amuser suffisamment puisqu’elle permet 20 connexions concurrentes et 100 000 messages/jour.

 

Suggestion d'articles :

  1. Envoyez des notifications push Ă  vos applications Android avec C2DM
  2. Le push web vu par Diffusion – Partie 2
  3. Le push web vu par Diffusion – Partie 1

Catégories: Blog Société

Sérialisation : Thrift et Protocol Buffers, principes et aperçu

mer, 01/11/2012 - 14:00

La sĂ©rialisation est une des bases de la transmission de donnĂ©es entre systĂšmes. Certains langages proposent d’ailleurs une mĂ©thode de sĂ©rialisation en standard, qui leur est souvent propre.

L’interopĂ©rabilitĂ© entre systĂšmes hĂ©tĂ©rogĂšnes nĂ©cessite que le format de sĂ©rialisation soit comprĂ©hensible par diffĂ©rents langages et plates-formes. De nombreux standards utilisent le mĂ©canisme d’IDL (Interface Description Language) pour rĂ©pondre Ă  ce besoin : ASN.1, CORBA ou encore SOAP.

Depuis quelques annĂ©es, de nouveaux frameworks basĂ©s sur un IDL ont vu le jour pour l’interopĂ©rabilitĂ© de technologies hĂ©tĂ©rogĂšnes dans une optique d’Ă©conomie de bande passante. Parmi eux, on trouve Thrift et Protocol Buffers. Ce premier article prĂ©sente les deux frameworks sous l’angle de la sĂ©rialisation des messages et dĂ©taille leur utilisation en Java.

Historique et objectifs

Thrift et Protocol Buffers (abrĂ©gĂ© en protobuf) ont en commun d’avoir Ă©tĂ© dĂ©veloppĂ©s par des acteurs majeurs du Web. Thrift a Ă©tĂ© initialement dĂ©veloppĂ© par Facebook, et est dĂ©sormais en incubation chez Apache suite Ă  son passage en open source. Protocol Buffers a commencĂ© comme framework interne chez Google, oĂč son utilisation est majoritaire. L’ouverture de son code source s’est faite aprĂšs une remise Ă  plat nommĂ©e Proto2.

Afin de s’affranchir des barriĂšres de langages, ces deux frameworks reposent sur des mĂ©canismes classiques :

  • un IDL pour dĂ©crire les structures de donnĂ©es,
  • une gĂ©nĂ©ration statique du code de sĂ©rialisation dans divers langages de programmation,
  • un protocole de sĂ©rialisation, c’est-Ă -dire une mĂ©thode de reprĂ©sentation des messages.

On peut par exemple gĂ©nĂ©rer du code permettant l’Ă©change de messages entre Java et C++ :

Cet article se focalise en prioritĂ© sur le protocole de sĂ©rialisation, qu’il convient de distinguer du protocole de transport. Ce dernier correspond au support vĂ©hiculant le message sĂ©rialisĂ© suivant le protocole de sĂ©rialisation.

Pourquoi de nouveaux protocoles de sérialisation ?

Protobuf se limite au protocole de sĂ©rialisation, et est donc similaire Ă  la CDR de CORBA ou Ă  ASN.1 associĂ© Ă  un encodeur : il s’agit uniquement de reprĂ©senter un message sous forme sĂ©rialisĂ©e.
Thrift y ajoute des implĂ©mentations de RPC en mode client/serveur sur plusieurs protocoles de transport (HTTP, Socket, File…). Leurs fonctionnalitĂ©s sont limitĂ©es par rapport Ă  ce que propose CORBA par exemple : Thrift ne propose pas de gestion des transactions, de reprise sur erreur ou de fonctionnalitĂ©s d’annuaire.

Les principes de Thrift et Protocol Buffers ne sont donc pas nouveaux. Ces deux frameworks ont néanmoins deux avantages majeurs pour les contextes de haute disponibilité et forte scalabilité, tels ceux de Google ou Facebook :

  • CompatibilitĂ© ascendante/descendante : permet de faire Ă©voluer l’interface sans nĂ©cessiter de redĂ©ploiement immĂ©diat de toutes les applications concernĂ©es
  • Taille de message et temps de sĂ©rialisation/dĂ©sĂ©rialisation optimisĂ©s : permettent de minimiser les besoins de bande passante et de temps de traitement. Le champ d’utilisation peut de plus ĂȘtre Ă©tendu Ă  la persistance de donnĂ©es.

L’argument de compacitĂ© du message est uniquement valable si on emploie le protocole de sĂ©rialisation binaire de Protobuf et le protocole compact de Thrift, car ils permettent une optimisation de la taille du message Ă  l’octet prĂšs.
Par exemple, les deux sĂ©rialisent une chaĂźne de caractĂšres en la faisant prĂ©cĂ©der par sa longueur, Ă  l’instar de CDR. Mais ils codent cette longueur avec un varint, qui est plus compact que l’entier sur 32 bits employĂ© par CDR.

IDL et interfaces

Thrift et Protobuf se ressemblent Ă©normĂ©ment en pratique. L’IDL du premier s’appelle Thrift IDL, celui du second se nomme simplement protocol buffer language. Les deux frameworks supportent la plupart des types de donnĂ©es courants, le dĂ©tail est disponible ici pour Thrift et lĂ  pour Protobuf.

L’exemple considĂ©rĂ© est l’objet Node dont une version en Java est la suivante :

package com.octo.example.serialization.model;

public class Node implements Serializable {
    private Integer mNumber;
    private boolean mEven;
    private Double mRate;
    private RoomType mType;
    private String mDescription;
[...]
}

Il contient quelques membres de types différents, dont une énumération ; les accesseurs ont été omis par concision.

Voici le descripteur équivalent en Thrift IDL : tree.thrift

namespace java com.octo.example.serialization.model.thrift
enum RoomType {
        SINGLE =0,
        DOUBLE =1,
        SUITE =2
}
struct Node {
    1: optional i32 number,
    2: optional bool even,
    3: optional double rate,
    4: optional RoomType type = RoomType.SINGLE,
    5: optional string description
}

La premiĂšre ligne permet de spĂ©cifier le package Java auquel appartiendra le code gĂ©nĂ©rĂ© par le compilateur Thrift. L’Ă©numĂ©ration RoomType associe une constante numĂ©rique Ă  chaque valeur possible. Puis notre objet Node lui-mĂȘme est dĂ©fini.
En Thrift IDL, chaque champ est défini par

  • un identifiant unique
  • suivi de l’indication s’il est optionnel ou non (optional/mandatory),
  • puis son type,
  • son nom
  • et une valeur par dĂ©faut prĂ©cĂ©dĂ©e du signe = si nĂ©cessaire.

Le message est donc sĂ©rialisĂ© sous forme clef-valeur, avec l’identifiant unique comme clef. La valeur contient le type puis la valeur elle-mĂȘme. Voici Ă  fins d’illustration ce que donne la struct Node sĂ©rialisĂ©e avec le protocole de sĂ©rialisation TJSONProtocol de Thrift :

{
  "1":{
    "i32":0
  },
  "2":{
    "tf":1
  },
  "3":{
    "dbl":0.0
  },
  "4":{
    "i32":0
  },
  "5":{
    "str":"Lorem ipsum dolor sit amet, cons"
  }
}

Voici le pendant en Protocol Buffers language : tree.proto

package serialization;
option java_package = "com.octo.example.serialization.model";
option java_outer_classname = "TreeProto";
enum RoomType {
    SINGLE =0;
    DOUBLE =1;
    SUITE =2;
}
message Node {
    optional int32 number =1;
    optional bool even =2;
    optional double rate =3;
    optional RoomType type =4 [default = SINGLE];
    optional string description = 5;
}

La premiĂšre ligne correspond au package protobuf, ce qui permet d’Ă©viter les conflits lors d’imports de fichiers .proto externes par exemple. Les deux lignes suivantes sont des options propres Ă  la gĂ©nĂ©ration de code Java ; il s’agit du nom de package et du nom de la classe gĂ©nĂ©rĂ©e par protoc.
La dĂ©claration d’un champ se fait de maniĂšre similaire Ă  celle de Thrift :

  • l’indication si le champs est optionnel (optional) ou non (required),
  • puis son type,
  • son nom,
  • son identifiant unique prĂ©cĂ©dĂ© du signe =
  • suivi d’une valeur par dĂ©faut si nĂ©cessaire.

La sĂ©rialisation suit le mĂȘme principe que celle de Thrift : le message est sĂ©rialisĂ© en clef-valeur avec l’identifiant unique comme clef. Le dĂ©tail de l’encodage binaire est fourni ici.

Versioning et Ă©volution de l’interface

La compatibilitĂ© ascendante/descendante des messages nĂ©cessite de respecter certaines rĂšgles afin d’ĂȘtre garantie. Ces derniĂšres sont similaires pour les deux frameworks.
La pierre angulaire de la compatibilitĂ© est l’identifiant unique associĂ© aux champs. La principale rĂšgle de dĂ©sĂ©rialisation est que tout champ d’identifiant inconnu est ignorĂ©. Il reste nĂ©anmoins conservĂ© dans le message car il peut ĂȘtre utile Ă  d’autres versions de l’interface.

Les rĂšgles Ă  respecter lors de l’Ă©volution des interface sont les suivantes

  • les identifiants de champs doivent ĂȘtre invariants
  • tout champ ajoutĂ© dans une nouvelle version doit ĂȘtre optionnel, sous peine de ne plus pouvoir lire les messages issus d’anciennes versions
  • les valeurs par dĂ©faut ne doivent en gĂ©nĂ©ral pas ĂȘtre modifiĂ©es. En effet, elles ne sont pas transmises dans le message sĂ©rialisĂ©, mais assignĂ©es par le code de dĂ©sĂ©rialisation
  • tout champ obligatoire doit ĂȘtre prĂ©sent dans toutes les versions de l’interface, passĂ©es ou futures.

A ces rĂšgles protobuf ajoute

Génération du code

L’Ă©tape suivante consiste Ă  gĂ©nĂ©rer le code correspondant aux objets et interfaces dĂ©finies ci-dessus. Le compilateur Thrift est utilisĂ© de la maniĂšre suivante :

thrift -v --gen java -o . tree.thrift

Le code généré est placé dans un sous-répertoire gen-java, avec autant de fichiers-classes que de structs et énumérations :

gen-java
└── com
    └── octo
        └── example
            └── serialization
                └── model
                    └── thrift
                        ├── Node.java
                        └── RoomType.java

Pour Protobuf, le principe reste le mĂȘme, mĂȘme si la ligne de commande change un peu :

protoc -I=project/root/ --java-out=. tree.proto

Dans ce cas un unique fichier est gĂ©nĂ©rĂ©, contenant l’ensemble des messages sous forme de classes internes

java
└── com
    └── octo
        └── example
            └── serialization
                └── model
                    └── TreeProto.java
Cas particulier : déclaration avancée et récursion

Le but initial de l’exemple Ă©tait de sĂ©rialiser un arbre constituĂ© de nƓuds. Or Thrift ne supporte pas la dĂ©claration avancĂ©e, donc les structures rĂ©cursives. Cette limitation est explicite dans le white paper de Thrift :

Due to inherent complexities and potential for circular dependencies, we explicitly disallow forward declaration. Two Thrift structs cannot each contain an instance of the other.

Par exemple, le compilateur Thrift bloque sur deux erreurs lors du parsing de la struct suivante :

namespace java com.octo.example.serialization.model.thrift
struct InvalidNode {
    1: optional i32 number,
    2: optional bool even,
    3: optional double rate,
    4: optional RoomType type = RoomType.SINGLE,
    5: optional string description,
    6: list<InvalidNode> children
}
enum RoomType {
        SINGLE =0,
        DOUBLE =1,
        SUITE =2
}

La premiĂšre est Ă  la ligne 6 : Type « RoomType » has not been defined, et la seconde Ă  la ligne 8 : Type « Node » has not been defined.

Protobuf n’a pas cette limitation et compile donc sans erreur un .proto Ă©quivalent. La classe chargĂ©e de la sĂ©rialisation, CodedInputStream propose une sĂ©curitĂ© sur le niveau de rĂ©cursion. La limite par dĂ©faut est de 64, et peut ĂȘtre modifiĂ©e via la mĂ©thode setRecursionLimit.

Conversion modĂšle applicatif – objets sĂ©rialisables

Si l’applicatif utilise dĂ©jĂ  un modĂšle d’objets existants, des mĂ©thodes de conversion entre ce modĂšle et les objets sĂ©rialisables doivent ĂȘtre dĂ©veloppĂ©es. Ni Thrift ni protobuf ne proposent de moyen d’automatiser ou de gĂ©nĂ©rer ce code de conversion. Afin d’Ă©viter ce surcoĂ»t, il est prĂ©fĂ©rable de manipuler directement les objets sĂ©rialisables gĂ©nĂ©rĂ©s Ă  l’Ă©tape prĂ©cĂ©dente quand cela est possible.

Dans l’exemple, l’objet de dĂ©part Node est un simple POJO, la conversion a donc Ă©tĂ© codĂ©e manuellement dans des classes dĂ©diĂ©es Ă  la sĂ©rialisation. Les objets gĂ©nĂ©rĂ©s par Thrift exposent des accesseurs pour chacun des champs :

package com.octo.example.serialization.serializers.tree;

public class ThriftTreeSerializer {
[...]
    public com.octo.example.serialization.model.thrift.Node convertToSerializable(Node pNode) {
        com.octo.example.serialization.model.thrift.Node vNode = new com.octo.example.serialization.model.thrift.Node();
        vNode.setNumber(pNode.getNumber());
        vNode.setRate(pNode.getRate());
        vNode.setType(RoomType.valueOf(pNode.getType().toString()));
        vNode.setDescription(pNode.getDescription());
        vNode.setEven(pNode.isEven());
        for (Node vChild : pNode.getChildren()) {
            vNode.addToChildren(convertToNode1(vChild));
        }
        return vNode;
    }
}

Protobuf utilise des messages immuables et le pattern builder :

package com.octo.example.serialization.serializers.tree;

public class ProtoBufTreeSerializer {
[...]
    public com.octo.example.serialization.model.LimitedTreeProto.Node convertToSerializable(Node pNode) {
        com.octo.example.serialization.model.LimitedTreeProto.Node.Builder vBuilder = com.octo.example.serialization.model.LimitedTreeProto.Node.newBuilder()
        .setNumber(pNode.getNumber())
        .setRate(pNode.getRate())
        .setType(LimitedTreeProto.RoomType.valueOf(pNode.getType().toString()))
        .setDescription(pNode.getDescription())
        .setEven(pNode.isEven());
        for (Node vNode : pNode.getChildren()) {
            vBuilder.addChildren(convertToNode1(vNode));
        }
        return vBuilder.build();
    }
}

Une autre mĂ©thode consiste Ă  faire implĂ©menter l’interface Externalizable aux objets du modĂšle applicatif. Cela permet d’utiliser l’un des deux frameworks tout en maintenant la compatibilitĂ© avec les API de sĂ©rialisation Java standards. Cependant, l’utilisation du protocole de sĂ©rialisation de Java augmente la taille du message, notamment Ă  cause la prĂ©sence des noms de classes complets.
Sur un court message, le surcoĂ»t est rĂ©dhibitoire. À titre d’exemple, le mĂȘme Node pĂšse 49 octets s’il est sĂ©rialisĂ© par protobuf directement, et 118 octets si on utilise protobuf via Externalizable.writeExternal.

Sérialisation en pratique

Thrift propose plusieurs protocoles de sérialisation à choisir parmi les implémentations de TProtocol fournies, dont deux binaires :

  • TBinaryProtocol : code chaque champ est sous la forme longeur puis valeur binaire,
  • TCompactProtocol : produit un message plus compact grĂące Ă  des optimisations, dont l’utilisation systĂ©matique de varints.

Ce dernier est préférable et globalement équivalent à celui de protobuf. Voici un exemple de classe de sérialisation avec Thrift

package com.octo.example.serialization.serializers.tree;
import com.octo.example.serialization.model.thrift.Node;
[...]
public class ThriftTreeSerializer {
    public byte[] serialize(Node Object) throws Exception {
        TSerializer serializer = new TSerializer(new TCompactProtocol.Factory());
        return serializer.serialize(Object);
    }
    public Node deserialize(byte[] pMessage) throws Exception {
        TDeserializer deserializer = new TDeserializer(new TCompactProtocol.Factory());
        Node vRoot = new Node();
        deserializer.deserialize(vRoot, pMessage);
        return vRoot;
    }
[...]
}

Protobuf lui ne propose nativement qu’un protocole binaire. Des extensions permettent le support d’autres protocoles de sĂ©rialisation, par exemple protobuf-java-format qui sĂ©rialise en JSON, XML ou HTML.
La classe de sérialisation équivalente en protobuf :

package com.octo.example.serialization.serializers.tree;
import com.octo.example.serialization.model.LimitedTreeProto.Node;
[...]
public class ProtoBufTreeSerializer {
    public byte[] serialize(Node object) throws Exception {
        return object.toByteArray();
    }
    public Node deserialize(byte[] message) throws Exception {
        CodedInputStream vStream = CodedInputStream.newInstance(message);
        return Node.parseFrom(vStream);
    }
[...]
}
Conclusion

Thrift et Protocol Buffers sont deux frameworks qui n’innovent pas sur le principe. Les deux frameworks sont relativement similaires et rĂ©pondent surtout aux besoins des sociĂ©tĂ©s qui les ont créées, Facebook et Google. Elles ont revisitĂ© les mĂ©canismes classiques d’interopĂ©rabilitĂ© via un IDL, en mettant l’accent sur les performances et la compatibilitĂ© ascendante et descendante, deux caractĂ©ristiques cruciales dans leur contexte. Ces frameworks proposent principalement de la sĂ©rialisation, avec en sus une implĂ©mentation RPC simple pour Thrift.

Du fait de la gĂ©nĂ©ration statique de code et de la nĂ©cessitĂ© potentielle de dĂ©velopper des mĂ©thodes de conversion, leur utilisation peut s’avĂ©rer coĂ»teuse Ă  mettre en Ɠuvre. Comme beaucoup d’outils spĂ©cialisĂ©s, il vaut donc mieux avoir un besoin avĂ©rĂ© de leurs avantages et bien Ă©valuer leurs limitations avant d’envisager leur utilisation.

D’autres frameworks de sĂ©rialisation utilisent des principes diffĂ©rents de ceux de Thrift et Protocol Buffers. Apache Avro notamment, qui repose sur la prĂ©sence systĂ©matique de l’interface dans le format sĂ©rialisĂ©. Cela lui permet de rendre la gĂ©nĂ©ration de code optionnelle et de se passer d’identifiants uniques de champs.

Thrift et Protocol Buffers obtiennent des performances Ă©quivalentes dans un benchmark regroupant plusieurs sĂ©rialiseurs Java. Ce benchmark se limite toutefois Ă  l’utilisation d’un unique message. Dans un prochain article, les deux frameworks seront comparĂ©s en termes de compacitĂ© de la sĂ©rialisation avec une structure de message variable.

Références

Les versions utilisées pour cet article sont la 0.8.0 pour Thrift et la 2.4.1 pour Protocol Buffers. Les liens suivants sont en anglais.

Suggestion d'articles :

  1. Thrift et Protocol Buffers : compacité du message sérialisé dans le monde Java
  2. Des principes (ou quelques idĂ©es…) REST et du Mashup

Catégories: Blog Société

Petit-dĂ©jeuner OCTO – Tablettes : passons Ă  l’ùre du post-PC le 26 janvier

jeu, 01/05/2012 - 15:22

OCTO organise le jeudi 26 janvier 2012 Ă  partir de 8h45 un petit-dĂ©jeuner gratuit, Ă  Eurosites George V  « Tablettes : passons Ă  l’ùre du post-PC ».

Avec la participation de BNP Paribas Fortis, ARVAL et AXA.

Pour vous inscrire cliquez ici . DĂ©couvrez le descriptif de l’évĂšnement et les intervenants dans ce billet.

En moins de 2 ans les tablettes se sont imposées partout. Elles ont cannibalisé le marché du PC et tué celui du netbook !
Internet, mails, rĂ©seaux sociaux, actualitĂ©s ou jeux. Ceux qui ont essayĂ©e la tablette l’ont adoptĂ©e.

Rapidité, légÚreté, simplicité, autonomie et prix sont au coeur de ce succÚs.

Vos entreprises ont l’opportunitĂ© d’épouser cette rĂ©volution et de faire Ă©voluer leurs mĂ©tiers, services et applications en tirant pleinement partie des tablettes. Les exemples ne manquent pas : outils d’aide Ă  la vente, applications RH, bureau mobile, contrĂŽle qualitĂ© in situ, documentation ou encore formation.

Et vous, quels usages faites ou ferez-vous des tablettes ?

OCTO Technology vous propose d’échanger, avec ses clients, autour des enjeux que reprĂ©sentent les tablettes en entreprise :

- Quelles applications métiers sur tablette ?
- Comment dégager du ROI ?
- Quelles sont les différences avec un développement smartphone ?
- Pouvez-vous faire confiance Ă  une tablette comme outil de travail ?
- Comment sécuriser les applications et les données de votre entreprise ?

Rejoignez la révolution le 26 Janvier 2012 au Georges V de 9h à 11h


A l’issue de ce petit-dĂ©jeuner vous aurez dĂ©couvert :

  • Les initiatives actuelles et Ă  venir dans les grandes entreprises
  • Les usages innovants dans les diffĂ©rents dĂ©partements (RH, commercial, opĂ©rationnel)
  • Les enjeux d’ergonomie et d’intĂ©gration dans le SI
  • Des retours d’expĂ©rience concrets et significatifs expliquĂ©s par leurs responsables

Ce petit-déjeuner sera présenté par :

Intervenants keynote :
- Jean-François Grang – OCTO Technology
- Olivier Martin – OCTO Technology

Intervenants table ronde :

- Antoine De Kerviler – Corsairfly – DSI
- Yvan Pirenne – BNP Paribas Fortis – Manager Internet & Mobile Banking
- Sebastien Somchit – ARVAL – Head of Interactive Marketing
- Guillaume LemĂȘle – AXA France Services – Directeur Conseil & Services Distribution Internet & Marketing
- Eric Biernat (animateur) – OCTO Technology

 

Ce petit-déjeuner est à destination de nos clients et prospects en priorité.

Cliquez ici pour vous inscrire au petit-déjeuner : Tablettes

Suggestion d'articles :

  1. OCTO organise un petit-dĂ©jeuner Gestion des IdentitĂ©s le 27 janvier – TĂ©moignage d’Air Liquide
  2. Vidéo du petit-déjeuner « Comment bùtir votre Cloud ? » organisé par OCTO Technology
  3. VidĂ©o du petit-dĂ©jeuner « MapReduce -La rĂ©volution dans l’analyse des BigData » organisĂ© par OCTO

Catégories: Blog Société

OCTO vous souhaite une trÚs belle année 2012 !!

lun, 01/02/2012 - 14:00

Chers lecteurs, tous les OCTOs vous souhaitent une belle et heureuse annĂ©e 2012 ! Nous espĂ©rons qu’elle sera remplie de  projets ambitieux, d’Ă©changes, de bonheur et de rĂ©ussite !

Et surtout merci de nous faire part de vos avis, vos envies et vos remarques. C’est grĂące Ă  vous  que nous prenons toujours plaisir Ă  alimenter le blog  d’articles , de prises de position et des sujets de « geeks » et de « boss » qui nous passionnent.

Une occasion pour nous de vous faire partager la carte de voeux OCTO édition 2012 ! Oui, en 2012 nous changerons notre logo. Nouvelle année, nouveau logo mais toujours OCTO ! 


 

 

Suggestion d'articles :

  1. Appel Ă  candidature : proposez votre session Ă  USI 2012 !
  2. OCTO Technology accompagne Corsairfly, filiale du groupe TUI TRAVEL, dans l’évolution de son systĂšme d’information Ă  horizon 2012
  3. Ouverture des inscriptions USI 2012

Catégories: Blog Société

VidĂ©o du petit-dĂ©jeuner NoSQL : « l’Extreme Transaction Processing » devient une rĂ©alitĂ©

mer, 12/28/2011 - 15:14

Jeudi 15 dĂ©cembre, OCTO organisait un petit-dĂ©jeuner NoSQL : « l’Extreme Transaction Processing, devient une rĂ©alitĂ© ».

Aujourd’hui, la multiplication des systĂšmes connectĂ©s Ă  Internet (smartphone, tablette, TV connectĂ©e, vĂ©hicule connectĂ©) et l’émergence des nouveaux flux de donnĂ©es issus notamment du web social (Facebook commerce, mobile-to-mobile, etc) vont pousser un peu plus les SystĂšmes d’Information vers l’Extreme Transaction Processing (XTP).

(Pour plus d’informations sur le contenu, veuillez cliquer ici)

GrĂące Ă  la vidĂ©o de l’évĂšnement disponible sur You Tube, vous pouvez dĂ©couvrir les divers points abordĂ©s lors de ce Petit-DĂ©jeuner, Ă  savoir :

  • les concepts et les opportunitĂ©s mĂ©tiers autour de l’ »Extreme Transaction Processing« 
  • les enjeux d’architecture et d’exploitation
  • les fonctionnalitĂ©s et l’implĂ©mentation faite par les solutions VMware Gemfire et SQLFire

Pour tout autre renseignement, contactez nous sur : contact@octo.com

  Cliquez sur l’image pour lancer la vidĂ©o  

Suggestion d'articles :

  1. Petit-dĂ©jeuner NoSQL : « l’Extreme Transaction Processing » devient une rĂ©alitĂ©
  2. Vidéo du petit-déjeuner « Comment bùtir votre Cloud ? » organisé par OCTO Technology
  3. VidĂ©o du petit-dĂ©jeuner « MapReduce -La rĂ©volution dans l’analyse des BigData » organisĂ© par OCTO

Catégories: Blog Société

L’analyse dĂ©cisionnelle en temps rĂ©el Convergence entre Big Data et Complex Event Processing

mar, 12/20/2011 - 15:26

OCTO organise le  jeudi 12 janvier 2012 Ă  partir de 8h45 un petit-dĂ©jeuner gratuit Big Data & CEP : « L’analyse dĂ©cisionnelle en temps rĂ©el : Convergence entre Big Data et Complex Event Processing », Ă  Eurosites George V.

Pour vous inscrire cliquez ici . DĂ©couvrez le descriptif de l’évĂšnement et les intervenants dans ce billet.

Le pilotage des activités opérationnelles devrait pouvoir se faire au rythme du business et avec une connaissance précise de son état courant.

La lutte contre la fraude, l’analyse des parcours clients en temps rĂ©el ou le suivi des liquiditĂ©s permettent d’amĂ©liorer vos profits et demandent une analyse complexe instantanĂ©e sur d’importants volumes d’évĂšnements.

Ces nouveaux usages en matiĂšre d’analyse des flux de donnĂ©es introduisent de nouveaux dĂ©fis techniques et d’architecture des SI : comment faire converger analyse temps rĂ©el et gestion de volume de donnĂ©es important ?

Les Ă©volutions des marchĂ©s du DĂ©cisionnel et du CEP permettent d’y apporter aujourd’hui des rĂ©ponses concrĂštes. Des solutions sont dĂ©jĂ  opĂ©rationnelles dans diffĂ©rents secteurs : finance, telecoms, logistique, e-commerce, 


OCTO Technology et Quartet FS  vous proposent de découvrir les nouvelles opportunités métiers liées à ces évolutions technologiques, positionner ces nouvelles architectures dans vos SI et les possibilités de ActivePivot Sentinel.

A l’issue de ce sĂ©minaire, vous aurez dĂ©couvert :

  • Les enjeux d’architecture de l’analyse de donnĂ©es en temps rĂ©el
  • Le nouveau panorama des solutions capables d’y rĂ©pondre
  • Les fonctionnalitĂ©s du produit ActivePivot Sentinel

Ce petit-déjeuner sera présenté par :

Julien CABOT, OCTO, Associé
Olivier MALLASSI, OCTO, Architecte Senior
Romain COLLE, Quartet Financial Systems, Senior R&D Engineer

Cliquez ici pour vous inscrire au petit-déjeuner : Big Data & CEP

Suggestion d'articles :

  1. Complex Event Processing
  2. Complex Event Processing (CEP), de quoi s’agit-il?
  3. Complex Event Processing avec Esper

Catégories: Blog Société

Appel Ă  candidature : proposez votre session Ă  USI 2012 !

mar, 12/20/2011 - 15:12

L’annĂ©e derniĂšre USI vous a proposĂ© plus de 40 sessions. Mais le programme USI ne se fait pas sans vous, alors si vous avez une idĂ©e de session n’hĂ©sitez pas Ă  nous la soumettre et/ou venez voter pour vos sessions favorites !

Proposez votre session !

Leader d’opinion, porte-parole de sujets IT, super geek, manager ou partie prenante de la DSI
 le formulaire pour proposer votre session est en ligne et ce jusqu’au 31/01/2012. Profitez-en !

L’Ă©quipe USI dĂ©terminera, aprĂšs Ă©tude de votre proposition, la durĂ©e de votre session, qui sera de 40 ou de 20 minutes. Pour rappel, le premier critĂšre de sĂ©lection de l’Ă©quipe USI sera la qualitĂ© du rĂ©sumĂ© de session proposĂ© (fond et forme). Merci donc d’en tenir compte lors du remplissage de ce formulaire.

L’équipe programme Ă©tudiera toutes les propositions et sĂ©lectionnera les sessions qui lui paraĂźtront les plus intĂ©ressantes. Vous serez peut-ĂȘtre invitĂ© Ă  venir prĂ©senter votre session lors d’une journĂ©e dĂ©diĂ©e : mi fĂ©vrier et nous informerons de notre dĂ©cision finale fin mars 2012.

500 personnes, opĂ©rationnels ou managers dans la DSI ou les directions mĂ©tiers, sont attendus pour cette nouvelle Ă©dition. Une belle audience donc  pour votre prĂ©sentation et rencontrer vos pairs ! N’hĂ©sitez plus !

Cliquez ici pour soumettre votre session à l’USI

Votez pour vos sessions préférées

Nous vous invitons à venir consulter toutes les sessions qui seront proposées cette année et de votre celles que vous préférez et que vous aimeriez voir à USI 2012.

Ou parlez-en tout simplement


MĂȘme si vous ne proposez pas de session vous avez peut-ĂȘtre dans votre entourage une personne qui le peut et que vous jugez pertinente.  Alors  n’hĂ©sitez pas ! Et partagez l’info !

A vos candidatures donc et merci !

L’équipe USI

Suggestion d'articles :

  1. Ouverture des inscriptions USI 2012
  2. Session OCTO aux TechDays 2011
  3. Code et diapos de la session Spring et TDD du ParisJUG

Catégories: Blog Société

Untar sous iOS, une approche pragmatique

ven, 12/16/2011 - 17:53

Les connections réseaux sont une source fréquente de lenteur des applications mobiles. Remplacer 10 téléchargements de 1Mo par 1 de 10Mo peut améliorer le fonctionnement de votre application.

L’utilitaire unix Tar permet justement de regrouper des fichiers en un seul package. Malheureusement aucune implĂ©mentation sous iOS de tar n’est satisfaisante : trop lourde et surdimensionnĂ©e par rapport aux besoins d’une simple application.

Pourtant une librairie qui dĂ©compresserait simplement des fichier tar n’est pas trop compliquĂ©e Ă  dĂ©velopper.

La suite en anglais: http://blog.octo.com/en/untar-on-ios-the-pragmatic-way/

Suggestion d'articles :

  1. Une approche de la qualitĂ© logicielle…
  2. 5 minutes pour : Monter en complexité, Approche TDD / Tests en PHP, PHP & Ajax
  3. Libérez la touche F1 sous Internet Explorer

Catégories: Blog Société