{"id":1786,"date":"2024-03-05T16:51:04","date_gmt":"2024-03-05T15:51:04","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1786"},"modified":"2024-03-05T17:01:02","modified_gmt":"2024-03-05T16:01:02","slug":"concevoir-un-saas-multitenant","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/concevoir-un-saas-multitenant\/","title":{"rendered":"Concevoir un SaaS multitenant"},"content":{"rendered":"<p>Cet article se repose sur mon talk <a href=\"https:\/\/www.youtube.com\/watch?v=JkBT4kVa9D8\" title=\"Concevoir un SaaS multitenant sur Youtube\" rel=\"noopener\" target=\"_blank\">Concevoir un SaaS multitenant<\/a> fait \u00e0 Cloud Nord le 12 octobre 2023.<\/p>\n<p><a href=\"https:\/\/www.kestra.io\" rel=\"noopener\" target=\"_blank\">Kestra<\/a> est une plate-forme d\u2019orchestration et de scheduling de donn\u00e9e hautement scalabe, qui cr\u00e9e, ex\u00e9cute, planifie et surveille des millions de pipelines complexes. Pour une introduction \u00e0 Kestra, vous pouvez lire <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/introduction-a-kestra\/\" title=\"Introduction \u00e0 Kestra\">mon article sur le sujet<\/a>.<\/p>\n<p>Une des \u00e9volutions r\u00e9cente de Kestra dont j&rsquo;ai \u00e9t\u00e9 charg\u00e9 fut le support du multitenant, cet article va vous raconter la conception qui a \u00e9t\u00e9 faite pour l&rsquo;ajout de cette fonctionnalit\u00e9.<\/p>\n<h2>Le Multitenant et ses diff\u00e9rents mod\u00e8les<\/h2>\n<p>Le multitenant peut \u00eatre d\u00e9fini comme un principe d&rsquo;architecture logicielle permettant \u00e0 un logiciel de servir plusieurs organisations clientes (tenant en anglais, ou locataire en fran\u00e7ais) \u00e0 partir d&rsquo;une seule installation.<\/p>\n<p>Le multitenant simule plusieurs instances logiques dans une instance physique unique. Le but \u00e9tant de ma\u00eetriser les co\u00fbts d&rsquo;h\u00e9bergement et d&rsquo;op\u00e9ration.<\/p>\n<p>Il existe plusieurs mod\u00e8les de multitenant.<\/p>\n<h3>Une instance par tenant<\/h3>\n<ul><li>Une instance de l&rsquo;application est d\u00e9marr\u00e9e pour chaque tenant, le multitenant est g\u00e9r\u00e9 au-dehors de l&rsquo;application.<\/li>\n\n<li>Pros : simplicit\u00e9.<\/li>\n\n<li>Cons : co\u00fbt d&rsquo;op\u00e9ration, il faut d\u00e9marrer une application par tenant.<\/li>\n<\/ul>\n<h3>Une base par tenant<\/h3>\n<ul><li>Une base de donn\u00e9es est d\u00e9marr\u00e9e pour chaque tenant, la seule logique \u00e0 impl\u00e9menter est la s\u00e9lection de la base.<\/li>\n\n<li>Pros : simplicit\u00e9, co\u00fbt d&rsquo;impl\u00e9mentation.<\/li>\n\n<li>Cons : co\u00fbt d&rsquo;op\u00e9ration, il faut d\u00e9marrer une base par tenant.<\/li>\n<\/ul>\n<h3>Un sch\u00e9ma par tenant<\/h3>\n<ul><li>Un sch\u00e9ma de base de donn\u00e9es est cr\u00e9\u00e9 pour chaque tenant, la seule logique \u00e0 impl\u00e9menter est la s\u00e9lection du sch\u00e9ma.<\/li>\n\n<li>Pros : simplicit\u00e9, co\u00fbt d&rsquo;impl\u00e9mentation, co\u00fbt d&rsquo;op\u00e9ration.<\/li>\n\n<li>Cons : n\u00e9cessite une base offrant des sch\u00e9mas, la base unique est le SPOF.<\/li>\n<\/ul>\n<h3>Tenant au sein des tables\/messages<\/h3>\n<ul><li>Une information <code>tenantId<\/code> est ajout\u00e9e \u00e0 chaque ligne de chaque table.<\/li>\n\n<li>Pros : flexibilit\u00e9, co\u00fbt d&rsquo;op\u00e9ration.<\/li>\n\n<li>Cons : complexit\u00e9, co\u00fbt d&rsquo;impl\u00e9mentation.<\/li>\n<\/ul>\n<h2>L&rsquo;architecture de Kestra<\/h2>\n<p>Avant tout, il faut expliquer l&rsquo;architecture de Kestra.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-software-architecture.png?resize=640%2C360&#038;ssl=1\" alt=\"\" width=\"640\" height=\"360\" class=\"alignnone size-large wp-image-1788\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-software-architecture.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-software-architecture.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-software-architecture.png?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-software-architecture.png?resize=480%2C270&amp;ssl=1 480w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-software-architecture.png?w=1200&amp;ssl=1 1200w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Kestra est s\u00e9par\u00e9 en plusieurs composants qui communiquent entre eux par messages asynchrones via une queue. Les m\u00e9tadonn\u00e9es des flows sont stock\u00e9s dans un repository.<\/p>\n<p>Les diff\u00e9rents composants sont:<\/p>\n<ul><li>L&rsquo;<strong>Executor<\/strong>: contient la logique d&rsquo;orchestration.<\/li>\n\n<li>Le <strong>Scheduler<\/strong>: traite les diff\u00e9rents \u00e9v\u00e9nement d\u00e9clencheur d&rsquo;un flow (triggers).<\/li>\n\n<li>Le <strong>Worker<\/strong>: ex\u00e9cute les t\u00e2ches d&rsquo;un flow.<\/li>\n\n<li>L&rsquo; <strong>Indexer<\/strong>: composant optionnel qui permet d&rsquo;indexer la queue dans la base de donn\u00e9es.<\/li>\n\n<li>Le <strong>Webserver<\/strong>: sert l&rsquo;interface graphique et l&rsquo;API de Kestra.<\/li>\n<\/ul>\n<p>Le <strong>Worker<\/strong> est le seul composant \u00e0 acc\u00e9der aux syst\u00e8mes externes n\u00e9cessaires \u00e0 l&rsquo;ex\u00e9cution d&rsquo;un flow (bdd distance, service web, service cloud, &#8230;) ainsi qu&rsquo;au stockage interne de donn\u00e9e de Kestra.<\/p>\n<p>Kestra offre plusieurs modes de d\u00e9ploiements : standlone avec tous les composants en un seul processus ou micro-service avec un composant par processus.<\/p>\n<p>Kestra propose deux runners:<\/p>\n<ul><li>Le runner <strong>JDBC<\/strong> : Queue et Repository sont impl\u00e9ment\u00e9s via une base de donn\u00e9e (H2, PostgreSQL, MySQL).<\/li>\n\n<li>Le runner <strong>Kafka<\/strong> : Kafka est utilis\u00e9 comme Queue et Elasticsearch comme Repository. Ce runner n&rsquo;est disponible que dans l\u2019\u00e9dition d&rsquo;entreprise.<\/li>\n<\/ul>\n<h2>Le multitenant chez Kestra<\/h2>\n<h3>Le projet du SaaS<\/h3>\n<p>Kestra travail \u00e0 une version disponible en mode SaaS, Kestra Cloud.<\/p>\n<p>\u00c0 ce jour, les contraintes du SaaS sont les suivantes :<\/p>\n<ul><li>Un \u00ab\u00a0gros\u00a0\u00bb cluster haute dispo avec un runner Kafka par fournisseur cloud \/ r\u00e9gion.<\/li>\n\n<li>Chaque tenant a ses propres ressources (namespace, flow, execution).<\/li>\n\n<li>Isolation de la donn\u00e9e.<\/li>\n\n<li>Un utilisateur est global \u00e0 tous les tenants.<\/li>\n<\/ul>\n<h3>La notion de namespace<\/h3>\n<p>Un flow est dans un namespace, les namespaces sont hi\u00e9rarchiques, un peu comme un r\u00e9pertoire de filesystem.<\/p>\n<p>Les namespaces permettent une configuration sp\u00e9cifique (task, secret, &#8230;) ainsi que la d\u00e9finition de r\u00f4les et d&rsquo;acc\u00e8s en version entreprise.<\/p>\n<p>Une des r\u00e9flexions qui a \u00e9t\u00e9 men\u00e9e \u00e9tait de savoir si la notion de namespace pouvait nous servir dans l&rsquo;impl\u00e9mentation de Kestra.<\/p>\n<h3>Les mod\u00e8les \u00e9valu\u00e9s<\/h3>\n<p>Trois diff\u00e9rents mod\u00e8les de multitenant ont \u00e9t\u00e9 \u00e9valu\u00e9s.<\/p>\n<ol><li><strong>Tenant par namespace<\/strong> : chaque namespace est un tenant. Cette solution est proche de la solution <em>Un sch\u00e9ma par tenant<\/em> mais en utilisant le namespace qui est une propri\u00e9t\u00e9 propre \u00e0 Kestra.<\/li>\n\n<li><strong>Tenant par namespace de base<\/strong> : chaque namespace de base est un tenant, un tenant pouvant alors avoir plusieurs namespace, les enfants du namespace de base. C&rsquo;est une d\u00e9clinaison du mod\u00e8le pr\u00e9c\u00e9dent.<\/li>\n\n<li>Tenant via une nouvelle propri\u00e9t\u00e9 <code>tenantId<\/code>.<\/li>\n<\/ol>\n<p>Un des runners de Kestra utilisant Kafka et Elasticsearch qui ne supportent pas la notion de sch\u00e9ma, seule une d\u00e9clinaison du mod\u00e8le <em>Tenant au sein des tables\/messages<\/em> \u00e9tait possible. Les trois solutions proposent donc d&rsquo;ajouter le tenant dans une nouvelle propri\u00e9t\u00e9 ou d&rsquo;utiliser une propri\u00e9t\u00e9 existante (namespace) pour limiter les changements n\u00e9cessaires.<\/p>\n<h3>Le choix<\/h3>\n<p><strong>Tenant via une propri\u00e9t\u00e9 <code>tenantId<\/code>.<\/strong><\/p>\n<p>L&rsquo;utilisation du namespace aurait \u00e9t\u00e9 pratique, car nous avions d\u00e9j\u00e0 une isolation des flows par namespace ainsi qu&rsquo;une gestion des droits (RBAC). Mais cela aurait fortement r\u00e9duit les fonctionnalit\u00e9s d&rsquo;un utilisateur de notre Cloud, car un namespace ou un namespace de base n&rsquo;aurait pu \u00eatre utilis\u00e9 par diff\u00e9rents utilisateurs. Le seul mod\u00e8le qui r\u00e9pondait \u00e0 tous nos besoins sans limiter de futures fonctionnalit\u00e9s \u00e9tait donc l&rsquo;ajout d&rsquo;une nouvelle propri\u00e9t\u00e9 <code>tenantId<\/code>.<\/p>\n<h2>L&rsquo;impl\u00e9mentation<\/h2>\n<ol><li>On ajoute <code>tenantId<\/code> \u00e0 tous les objets du model.<\/li>\n\n<li>On filtre sur <code>tenantId<\/code> dans chaque requ\u00eate BDD.<\/li>\n\n<li>On r\u00e9sout le <code>tenantId<\/code> dans la couche API.<\/li>\n<\/ol>\n<p>\u00c7a semble simple non ? \ud83e\udd37<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?resize=640%2C83&#038;ssl=1\" alt=\"\" width=\"640\" height=\"83\" class=\"alignnone size-large wp-image-1791\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?resize=1024%2C132&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?resize=300%2C39&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?resize=768%2C99&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?resize=1536%2C198&amp;ssl=1 1536w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?resize=604%2C78&amp;ssl=1 604w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?w=1727&amp;ssl=1 1727w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-oss.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee-1024x132.png?resize=640%2C83&#038;ssl=1\" alt=\"\" width=\"640\" height=\"83\" class=\"alignnone size-large wp-image-1792\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?resize=1024%2C132&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?resize=300%2C39&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?resize=768%2C99&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?resize=1536%2C198&amp;ssl=1 1536w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?resize=604%2C78&amp;ssl=1 604w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?w=1727&amp;ssl=1 1727w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pr-ee.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Un plan se d\u00e9roule toujours\n<del>sans<\/del> avec accrocs !<\/p>\n<p>Ajouter une propri\u00e9t\u00e9 \u00e0 un grand nombre de classes \/ filtre \/ requ\u00eates \/ &#8230; am\u00e8ne un fort risque d&rsquo;oublie, et donc de bug. Et c&rsquo;est bien s\u00fbr ce qu&rsquo;il s&rsquo;est pass\u00e9. Malgr\u00e9 un grand soin lors de l&rsquo;impl\u00e9mentation, il manquait quelques endroits o\u00f9 le tenant n&rsquo;\u00e9tait pas pass\u00e9 (principalement d\u00fb \u00e0 l&rsquo;utilisation des builders de Lombok &#8230; je ne vais pas m\u2019appesantir dessus).\nDe m\u00eame certaines parties de Kestra n\u00e9cessitent d&rsquo;avoir connaissance de l&rsquo;int\u00e9gralit\u00e9 des donn\u00e9es (par exemple de l&rsquo;int\u00e9gralit\u00e9 des flow), il a fallu faire en sorte que, par exemple, quand on liste les flows depuis l&rsquo;API la liste soit filtr\u00e9 par tenant, mais pas quand on liste les flow depuis le scheduler de flow.<\/p>\n<p>Pour faciliter la migration de nos utilisateurs existant, nous avons permis l&rsquo;utilisation d&rsquo;un tenant par d\u00e9faut, qui est le tenant donc l&rsquo;identifiant est null. Ce fut la cause de nombreux autres bugs &#8230;<\/p>\n<p>Pour conclure, le multitenant est essentiel dans la mise en place d&rsquo;un SaaS, et apr\u00e8s avoir choisit avec soin son mod\u00e8le d&rsquo;impl\u00e9mentation, attendez-vous \u00e0 une impl\u00e9mentation longue, laborieuses, et source de bug. Pour pallier au risque de bugs, nous avons choisi de merger les PR sur le multitenant en d\u00e9but de cycle de release, ce qui nous a permis de la tester pendant un mois sur nos propres environnements de test avant de le d\u00e9livrer \u00e0 nos utilisateurs et ainsi d\u00e9couvrir ainsi une grande partie des bugs qui avait \u00e9t\u00e9 introduit. Je vous recommande fortement de pr\u00e9voir une p\u00e9riode de test importante comme nous l&rsquo;avons fait.<\/p>\n<p>Le mot de la fin : impl\u00e9menter une architecture multitenante n&rsquo;est pas facile, il faut donc id\u00e9alement l&rsquo;impl\u00e9menter au plus t\u00f4t dans une base de code.<\/p>","protected":false},"excerpt":{"rendered":"<p>Cet article se repose sur mon talk Concevoir un SaaS multitenant fait \u00e0 Cloud Nord le 12 octobre 2023. Kestra est une plate-forme d\u2019orchestration et de scheduling de donn\u00e9e hautement scalabe, qui cr\u00e9e, ex\u00e9cute, planifie et surveille des millions de pipelines complexes. Pour une introduction \u00e0 Kestra, vous pouvez lire mon article sur le sujet. Une des \u00e9volutions r\u00e9cente de Kestra dont j&rsquo;ai \u00e9t\u00e9 charg\u00e9 fut le support du multitenant, cet article va vous raconter la conception qui a \u00e9t\u00e9&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/concevoir-un-saas-multitenant\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[],"class_list":["post-1786","post","type-post","status-publish","format-standard","hentry","category-informatique"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1606,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/au-revoir-zenika-bonjour-kestra\/","url_meta":{"origin":1786,"position":0},"title":"Au revoir Zenika, bonjour Kestra","author":"admin","date":"mardi 10 janvier 2023","format":false,"excerpt":"Apr\u00e8s 4 ans, 4 mois et 4 jours (ou presque), je quitte Zenika. Ces 4 ann\u00e9es et quelques auront \u00e9t\u00e9 parmi les plus passionnantes de ma vie professionnelle. Je suis triste de quitter cette super soci\u00e9t\u00e9 dans laquelle j'ai pu m'\u00e9panouir, grandir et apprendre plein de choses. Je suis s\u00fbr\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1611,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/introduction-a-kestra\/","url_meta":{"origin":1786,"position":1},"title":"Introduction \u00e0 Kestra","author":"admin","date":"lundi  6 mars 2023","format":false,"excerpt":"Kestra est un orchestrateur et scheduler de donn\u00e9e open source. Avec Kestra, les workflows de donn\u00e9es, appel\u00e9s flows, utilisent le format YAML et sont ex\u00e9cut\u00e9s par son moteur via un appel API, l'interface utilisateur, ou un trigger (webhook, schedule, SQL query, Pub\/Sub message, \u2026). Les notions importantes de Kestra sont\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-01-1024x267.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-01-1024x267.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/kestra-01-1024x267.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1650,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/le-profiler-sql-de-visualvm\/","url_meta":{"origin":1786,"position":2},"title":"Le profiler SQL de VisualVM","author":"admin","date":"mardi  4 avril 2023","format":false,"excerpt":"Il y a peu, j'ai d\u00e9couvert le profiler SQL de VisualVM et je me suis dit que je devais aussi vous le faire d\u00e9couvrir ;). VisualVM est un outil qui fournit une interface visuelle pour afficher des informations d\u00e9taill\u00e9es sur les applications qui s'ex\u00e9cutent sur une machine virtuelle Java (JVM).\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25-1024x624.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25-1024x624.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Capture-decran-du-2023-04-03-14-17-25-1024x624.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1847,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/jooq-tip-ne-convertissez-pas-jsonb-en-string\/","url_meta":{"origin":1786,"position":3},"title":"jOOQ tip: ne convertissez pas JSONB en String","author":"admin","date":"mercredi 23 octobre 2024","format":false,"excerpt":"Il y a quelques semaines, en investiguant de possibles am\u00e9liorations de performance pour le backend JDBC de Kestra, j'ai remarqu\u00e9 qu'une m\u00e9thode qu'on utilisait pour mapper une entit\u00e9 \u00e0 persister en base de donn\u00e9es dans sa repr\u00e9sentation JSONB prenait beaucoup de temps dans nos profiles CPU. Dans le flame graph\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/366507373-c44206a5-0085-43cc-902e-97756319b0ea-1024x737.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/366507373-c44206a5-0085-43cc-902e-97756319b0ea-1024x737.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/366507373-c44206a5-0085-43cc-902e-97756319b0ea-1024x737.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2007,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/characterescapes-la-perle-cachee-de-jackson\/","url_meta":{"origin":1786,"position":4},"title":"CharacterEscapes: la perle cach\u00e9e de Jackson","author":"admin","date":"mercredi 10 septembre 2025","format":false,"excerpt":"A Kestra, la plateforme d'orchestration de donn\u00e9es pour laquelle je travaille, on a eu une issue (#10326) ouverte d'un utilisateur qui rapportait un probl\u00e8me avec la base PostgreSQL et le caract\u00e8re Unicode \\u0000. Une t\u00e2che de workflow qui retournait ce caract\u00e8re en outpout plantait. Apr\u00e8s investigation, PostgreSQL refuse de stocker\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":966,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/1-an-chez-zenika\/","url_meta":{"origin":1786,"position":5},"title":"1 an chez Zenika","author":"admin","date":"mardi  3 septembre 2019","format":false,"excerpt":"Aujourd'hui est un jour sp\u00e9cial, cela fait un an que je suis arriv\u00e9 chez Zenika, apr\u00e8s 9 ans en tant qu'architecte logiciel dans la DSI d'un grand groupe de retail. Et apr\u00e8s un an, quel est donc le bilan ? Tout d'abord, Zenika m'a surpris. Lors des \u00e9changes que j'ai\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1786"}],"version-history":[{"count":15,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1786\/revisions"}],"predecessor-version":[{"id":1804,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1786\/revisions\/1804"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}