Tous les produits
Search
Centre de documentation

Data Management:Configurer un algorithme de routage

Dernière mise à jour :Aug 28, 2026

Un algorithme de routage permet à une requête contenant le champ de routage d'une table logique de localiser directement le shard de table cible, sans calcul manuel du routage. Cette rubrique présente le format des expressions, la procédure de configuration, des exemples d'expressions de routage et les fonctions intégrées appelables dans une expression.

Pourquoi utiliser un algorithme de routage

Un algorithme de routage réduit la charge liée au routage. Une fois l'algorithme configuré pour une table logique, toute requête contenant le champ de routage localise rapidement le shard de table spécifié. Vous n'avez plus besoin de calculer manuellement les routes ni de basculer entre les bases de données et les tables physiques.

Pour en savoir plus sur les algorithmes de routage, consultez la section algorithme de routage.

Cas d'utilisation

  • Interroger des données provenant de shards de table spécifiques.

  • Modifier des données dans des shards de table spécifiques.

  • Exporter des données depuis des shards de table spécifiques.

Prérequis

  • Configurez une table logique dans une base de données logique. Pour obtenir des instructions, consultez la section table logique.

Configurer un algorithme de routage par modulo simple

La procédure suivante configure un algorithme de routage utilisant une opération de modulo simple. Avant de sélectionner une opération de modulo, tenez compte des types de champs pris en charge par chaque opération :

  • Opération de modulo simple — Prend uniquement en charge les champs de type numérique.

  • Hachage modulaire — Prend en charge les champs de type numérique ou chaîne.

  1. Accédez à la page Global Search et cliquez sur Query à droite de la base de données logique cible pour ouvrir la page SQL Console.

    Remarque

    Vous pouvez également choisir SQL Console > SQL Console dans la barre de menu supérieure.

  2. Dans le coin supérieur droit de la page, cliquez sur l'icône Icon that opens the table listIcon that opens the table list pour accéder à la page de liste des tables.

  3. Dans la ligne contenant la table logique cible, cliquez sur Configure Algorithm.

  4. Sur la page de liste des algorithmes, cliquez sur Create.

  5. Configurez les paramètres Algorithm Type, Modulo Operation, Table Partitioning Field et Modulus.

    Dans cet exemple, définissez Algorithm Type sur Modulo Operation on One Column, Modulo Operation sur Simple Modulo Operation, Table Partitioning Field sur id et Modulus sur 4. L'expression est #id#%4.

  6. Cliquez sur Save.

  7. Interrogez les données de la table ou exécutez des instructions INSERT sur la table logique pour vérifier le résultat du routage. Le système calcule le résultat du routage et insère les données dans le shard de table correspondant à l'index.

    Par exemple, si vous insérez une ligne de données avec un ID de 9, le résultat du routage calculé est 1 et les données sont insérées dans le shard de table logic_table_01.

Format de l'expression

L'algorithme de routage de sharding de table dans DMS est défini par une expression Groovy, similaire aux algorithmes de routage configurés dans le code de l'application. Une expression fait référence à un champ de routage au format # + champ de routage + #, par exemple #shardKey#. Le champ de routage correspond au champ que vous sélectionnez comme Table Partitioning Field.

Exemples d'expressions de routage

Dans les expressions suivantes, user_id est un exemple de champ de table. Les exemples sont regroupés selon ce que détermine l'expression : uniquement le shard de table, à la fois le shard de base de données et le shard de table, ou une cible dérivée d'une date, de chiffres dans une chaîne ou d'une fonction personnalisée.

  • Routage par règle de table

    • Opération de modulo simple

      • Modulo sur des nombres : #user_id#%100

      • Modulo en chaîne : #user_id#%10000%100

      • Modulo sur le hachage Java d'un nombre : Math.abs(#user_id#.hashCode())%100

    • Hachage modulaire sur des chaînes

      • Hachage d'une chaîne numérique : Math.abs(#user_id#.toString().hashCode())%100

      • Hachage d'une chaîne : Math.abs(#user_id#.hashCode())%100

      • CobarHash : Math.abs(cobarHash(#column#,start, end)).intdiv(8)

      • CobarOldHash : Math.abs(cobarOldHash(#column#, len)).intdiv(8)

  • Routage par règle de base de données

    • Même règle de nom de base de données et de table : 'schema_prefix_'+(#user_id#%10)+'.table_name'

    • Nom de la base de données et nom de la table

      • 'schema_prefix_'+(#user_id#%100)+'.table_name_prefix_'+(#user_id#%1000)

      • Même ensemble de shards de table dans chaque shard de base de données : 'schema_prefix_'+lastSwapZero(String.valueOf((#user_id#%1024).intdiv(128)),4)+'.table_name_prefix_'+lastSwapZero(String.valueOf((#user_id#%128)),4)

      • Routage vers un shard de base de données en divisant par 2 les chiffres 16 et 17 de la chaîne, et routage vers un shard de table en utilisant les chiffres 16 et 17 de la chaîne : 'schema_prefix_'+substring(#EXTEND_ID#,16,18).toLong().intdiv(2)+'.table_name_prefix_'+substring(#EXTEND_ID#,16,18)

  • Routage par date

    Routage vers la même table le même jour de chaque mois : dayOfMonth(#time#)

  • Routage par l'avant-dernier chiffre d'une chaîne

    Le nom de la table s'incrémente par pas de 10, donc le chiffre extrait est multiplié par 10. Si l'incrément est de 1, aucune multiplication n'est requise : Integer.valueOf(substring(#ip_id#,-3,-2))*10

  • Autres routages complexes

    Utilisez une fonction personnalisée :

    String func(String arg){ return arg.hashCode()%10;}
    'table_name_'+func(#user_id#)+'_other_'+func(#user_id#)
    • Ajoutez un saut de ligne entre la fonction et l'expression.

    • DMS prend en charge le routage à l'aide de la fonction CRC32(java.util.zip.CRC32). Pour en savoir plus sur Groovy, consultez Groovy.

Fonctions intégrées pour les expressions de routage

Vous pouvez appeler directement les fonctions intégrées suivantes dans une expression de routage.

  • cobarOldHash — L'ancien algorithme CobarHash.

    public static long cobarOldHash(String s, int len) {
      long h = 0;
      int sLen = s.length();
      for (int i = 0; (i < len && i < sLen); i++) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • cobarHash — Le nouvel algorithme cobarHash.

    public static long cobarHash(String s, int start, int end) {
      if (start < 0) {
          start = 0;
      }
      if (end > s.length()) {
          end = s.length();
      }
      long h = 0;
      for (int i = start; i < end; ++i) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • weekOfYear — Renvoie la semaine de l'année.

    public static int weekOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getWeekOfYear(date);
      }
      return 0;
    }
  • dayOfYear — Renvoie le jour de l'année.

    public static int dayOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getDayOfYear(date);
      }
      return 0;
    }
  • dayOfMonth — Renvoie le jour du mois.

    public static int dayOfMonth(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          return DateTimeUtils.getDayOfMonth(date);
      }
      return 0;
    }
  • dayOfWeek — Renvoie le jour de la semaine.

    public static int dayOfWeek(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          int dayOfWeek = DateTimeUtils.getDayOfWeek(date);
          if (dayOfWeek==1){
              dayOfWeek=7;
          }else {
              dayOfWeek=dayOfWeek-1;
          }
          return dayOfWeek;
      }
      return 0;
    }
  • substring — Extrait une sous-chaîne. Les positions de début et de fin prennent en charge les valeurs négatives, qui comptent à rebours depuis la fin de la chaîne.

    public static String substring(String value, int start, int end) {
      return StringUtils.substring(value, start, end);
    }
    public static String substring(String value, int start) {
      return StringUtils.substring(value, start);
    }
  • last4swap — Renvoie les quatre derniers caractères d'une chaîne. Si la chaîne contient moins de quatre caractères, des zéros sont ajoutés à gauche. Les quatre derniers caractères sont ensuite échangés par paires.

    public static String last4swap(String value) {
      if(value.length() < 4) {
          value = StringUtils.leftPad(value, 4, '0');
      }
      return StringUtils.substring(value, -2)+StringUtils.substring(value, -4, -2);
    }
  • lastSwapZero — Renvoie une chaîne de la longueur minimale spécifiée. Si la chaîne est plus courte que la longueur spécifiée, des zéros sont ajoutés avant les chiffres.

    public static String lastSwapZero(String value, int length) {
      if (value.length() < length) {
          return StringUtils.leftPad(value, length, '0');
      }
      return value;
    }