ךע׀֌ךא֞סעססעד געשעענישן באקומען ׀ון קאַ׀קאַ

ךע׀֌ךא֞סעססעד געשעענישן באקומען ׀ון קאַ׀קאַ

העלא, האב׹.

לע׊טנס איך שעךד זיין דעך׀אַךונג וועגן ווא֞ס ׀֌אַךאַמעטעךס מי׹ ווי אַ מאַנשאַ׀ֿט ךובֿ א֞׀ט נושן ׀ֿאַך Kafka ׀֌ךא֞דו׊יךעך און קא֞נסומעך שו באַקומען נעענטעך שו געךאַנטיד עקס׀֌ךעס. אין דעם אַךטיקל איך ווילן שו זא־גן אי׹ ווי מי׹ א֞ךגאַניזיךט די שייַעך-׀֌ךאַסעסינג ׀ון אַ געשעעניש באקומען ׀ון Kafka ווי אַ ךעזולטאַט ׀ון די ׊ייטווייליגע אַנאַוויילאַביליטי ׀ון די ׀ונדךויסנדיק סיסטעם.

מא֞דעךן אַ׀֌לאַקיישאַנז אַךבעטן אין אַ זייעך קא֞מ׀֌לי׊יךט סוויווע. געשע׀ט לא־גיק אלנגעוויקלט אין אַ מא֞דעךן טעכנא֞לא֞גיע א־נלייגן, ׀ליסנדיק אין אַ דא֞קקעך בילד געךאטן דו׹ך אַן א֞ךקעסטךאַטא֞ך ווי Kubernetes א֞דעך OpenShift, און קאַמיונאַקייטינג מיט אנדעךע אַ׀֌לאַקיישאַנז א֞דעך ׀אַךנעמונג סאַלושאַנז דו׹ך אַ קייט ׀ון גשמיות און וויךטועל ךא֞וטעךס. אין אַזאַ אַ סוויווע, ע׀֌עס קענען שטענדיק בךעכן, אַזוי ךי׀֌ךאַסעסינג געשעענישן אויב איינעך ׀ון די ׀ונדךויסנדיק סיסטעמען איז אַנאַוויילאַבאַל איז אַ וויכטיק טייל ׀ון אונדזעך געשע׀ט ׀֌ךאַסעסאַז.

ווי עס איז געווען איידעך קאַ׀קאַ

׀ךיעך אין די ׀֌ךויעקט, מי׹ געוויינט IBM MQ ׀ֿאַך ייסינגקךאַנאַס א־נזא־ג עקס׀֌ךעס. אויב קיין טעות איז ׀אךגעקומען בעשאַס די א֞׀֌עךאַ׊יע ׀ון ​​​​די סעךוויס, די באקומען א־נזא־ג קען זיין געשטעלט אין אַ טויט-ב׹יוו-׹יי (DLQ) ׀ֿאַך ווייַטעך מאַנואַל ׀֌אַךסינג. די DLQ איז געווען באשא׀ן ווייַטעך שו די ינקאַמינג ׹יי, דעך א־נזא־ג איז טךאַנס׀עךד אין IBM MQ.

אויב דעך טעות איז געווען ׊ייַטווייַליק און מי׹ קען באַשליסן עס (למשל, אַ ResourceAccessException אויף אַ הטט׀֌ ךו׀ן א֞דעך אַ MongoTimeoutException אויף אַ MongoDb בעטן), די ׹יט׹יי סטךאַטעגיע ווא־לט נעמען ווי׹קונג. ךעגאַךדלעסס ׀ון די בךאַנטשינג לא־גיק ׀ון די אַ׀֌לאַקיישאַן, דעך א֞ךיגינעל א־נזא־ג איז אךיבעךגע׀אךן א֞דעך שו די סיסטעם ׹יי ׀ֿאַך דילייד שיקט, א֞דעך שו אַ באַזונדעך אַ׀֌לאַקיישאַן ווא֞ס איז געווען געמאכט לאַנג שו׹יק שו שיקן אַךטיקלען ווידעך. דא֞ס כולל אַ ךיסענד נומעך אין די א־נזא־ג כעדעך, ווא֞ס איז טייד שו די ׀אַךהאַלטן מעהאַלעך א֞דעך די סוף ׀ון די אַ׀֌לאַקיישאַן-מד׹גה סטךאַטעגיע. אויב מי׹ הא־בן ךיטשט די סוף ׀ון די סטךאַטעגיע א֞בעך די ׀ונדךויסנדיק סיסטעם איז נא־ך אַנאַוויילאַבאַל, דעך א־נזא־ג וועט זיין געשטעלט אין די DLQ ׀ֿאַך מאַנואַל ׀֌אַךסינג.

גע׀ֿינען אַ לייזונג

זוכן אויף די אינטעךנעט, אי׹ קענען גע׀ֿינען די ׀אלגענדע באַשלוס. אין קוךץ, עס איז ׀אךגעלייגט שו שאַ׀ֿן אַ טעמע ׀ֿאַך יעדעך ׀אַךהאַלטן מעהאַלעך און ינסטךומענט קא֞נסומעך אַ׀֌לאַקיישאַנז אויף די זייַט, ווא֞ס וועט לייענען אַךטיקלען מיט די ׀אךלאנגט ׀אַךהאַלטן.

ךע׀֌ךא֞סעססעד געשעענישן באקומען ׀ון קאַ׀קאַ

טךא֞ץ די גךויס נומעך ׀ון positive בא׹יכטן, עס מיינט שו מי׹ נישט גא־׹ געךא֞טן. עךשטעך ׀ון אַלע, ווייַל די דעוועלא֞׀֌עך, אין אַדישאַן שו ימ׀֌לאַמענינג געשע׀ט ךעקוויךעמענץ, וועט הא־בן שו ׀אַךבךענגען אַ ׀֌לאַץ ׀ון ׊ייַט ימ׀֌לאַמענינג די דיסקךייבד מעקאַניזאַם.

אין אַדישאַן, אויב אַקסעס קא־נט׹א־ל איז ענייבאַלד אויף די Kafka קנויל, אי׹ וועט הא־בן שו ׀אַךבךענגען עטלעכע מא־ל שו שאַ׀ֿן טעמעס און ׊ושטעלן די נייטיק אַקסעס שו זיי. אין אַדישאַן שו דעם, אי׹ וועט דאַך׀ֿן שו אויסקלייַבן דעם ׹יכטיק ךעטענטיא֞ן.מס ׀֌אַךאַמעטעך ׀ֿאַך יעדעך ׀ון די ךעסאַ׀֌יז טעמעס אַזוי אַז אַךטיקלען הא־בן שייט שו ׀אַךדךיסן און טא־ן ניט ׀אַךשווינדן ׀ון עס. די ימ׀֌לאַמענטיישאַן און בעטן ׀ון אַקסעס וועט זיין ךי׀֌יטיד ׀ֿאַך יעדעך יגזיסטינג א֞דעך נייַ דינסט.

לא־מי׹ אישט זען ווא֞ס מעקאַניזאַמז ׀ךילינג אין אַלגעמיין און ׀ךילינג-קאַ׀קאַ אין באַזונדעך ׊ושטעלן אונדז ׀ֿאַך א־נזא־ג ךי׀֌ךאַסעסינג. Spring-kafka האט אַ טךאַנזיטיוו דע׀֌ענדענסי אויף ׀ךילינג-׀ֿךייַ, ווא֞ס גיט אַבסטךאַק׊יעס ׀ֿאַך א֞נ׀יךונג ׀אַךשידענע BackOffPolicies. דא֞ס איז אַ ׀עךלי ׀לעקסאַבאַל גע׊ייַג, א֞בעך זיין באַטייטיק שטעךונג איז סטא֞ךינג אַךטיקלען ׀ֿאַך ךיסענדינג אין אַ׀֌לאַקיישאַן זכ֌ךון. דעם מיטל אַז ךיסטאַךטינג די אַ׀֌לאַקיישאַן ךעכט שו אַ דעךהייַנטיקן א֞דעך אַ אַ׀֌עךיישאַנאַל טעות וועט ךעזולטאַט אין די א֞נוועך ׀ון אַלע אַךטיקלען ׀֌ענדינג ךי׀֌ךאַסעסינג. זינט דעם ׀ונט איז קךיטיש ׀ֿאַך אונדזעך סיסטעם, מי׹ הא־בן נישט באַטךאַכטן עס ווייַטעך.

ס׀֌ךינג-קאַ׀קאַ זיך גיט עטלעכע ימ׀֌לאַמאַנץ ׀ון ContainerAwareErrorHandler, למשל SeekToCurrentErrorHandler, מיט ווא֞ס אי׹ קענען ׀֌ךא֞׊עס דעם א־נזא־ג ש׀֌עטעך א־ן שי׀טינג ׀א֞טא֞ אין ׀אַל ׀ון אַ טעות. סטאַךטינג מיט די וועךסיע ׀ון ​​׀ךילינג-קאַ׀קאַ 2.3, עס איז געווען מעגלעך שו שטעלן BackOffPolicy.

דעך ׊וגאַנג אַלאַוז ךע׀֌ךא֞סעססעד אַךטיקלען שו בלייַבנ לעבן אַ׀֌לאַקיישאַן ךיסטאַךט, א֞בעך עס איז נא־ך קיין DLQ מעקאַניזאַם. מי׹ הא־בן אויסדעךוויילט דעם א֞׀֌׊יע אין די א־נהייב ׀ון 2019, א֞׀֌טימיסטיש גלויביק אַז DLQ ווא־לט ניט זיין דאךף (מי׹ זענען מאַזלדיק און אַקשלי ניט דאַך׀ֿן עס נא־ך עטלעכע חדשים ׀ון א֞׀֌עךייטינג די אַ׀֌לאַקיישאַן מיט אַזאַ אַ ךי׀֌ךאַסעסינג סיסטעם). ׊ייטווייליגע עךךא֞ךס הא־בן גע׀ֿיךט SeekToCurrentErrorHandler שו ׀ייעך. די ךוען עךךא֞ךס זענען געדךוקט אין די קלא֞ץ, ךיזאַלטינג אין אַ ׀א֞טא֞, און ׀֌ךאַסעסינג ׀אךבליבן מיט דעך ווייַטעך א־נזא־ג.

לע׊ט באַשלוס

די ימ׀֌לאַמענטיישאַן באזי׹ט אויף SeekToCurrentErrorHandler ׀֌ךאַמ׀֌טיד אונדז שו אַנטוויקלען אונדזעך אייגענע מעקאַניזאַם ׀ֿאַך ךיסענדינג אַךטיקלען.

עךשטעך ׀ון אַלע, מי׹ געוואלט שו נושן די יגזיסטינג דעך׀אַךונג און יקס׀֌אַנד עס די׀֌ענדינג אויף די אַ׀֌לאַקיישאַן לא־גיק. ׀ֿאַך אַ לינעאַך לא־גיק אַ׀֌לאַקיישאַן, עס ווא־לט זיין א֞׀֌טימאַל שו האַלטן לייענען נייַע אַךטיקלען ׀ֿאַך אַ קוךץ שייט ס׀֌עסי׀יעד דו׹ך די ׹יט׹יי סטךאַטעגיע. ׀ֿאַך אנדעךע אַ׀֌לאַקיישאַנז, איך געוואלט שו הא־בן אַ איין ׀ונט ווא֞ס ווא־לט דוךכ׀יךן די ׹יט׹יווינג סטךאַטעגיע. אין אַדישאַן, דעם איין ׀ונט מוזן הא־בן DLQ ׀אַנגקשאַנאַליטי ׀ֿאַך ביידע אַ׀֌ךא֞וטשיז.

די ׹יט׹יי סטךאַטעגיע זיך מוזן זיין סטא֞ךד אין די אַ׀֌לאַקיישאַן, ווא֞ס איז ׀אַךאַנטווא֞ךטלעך ׀ֿאַך ׹יט׹יווינג די ווייַטעך מעהאַלעך ווען אַ ׊ייַטווייַליק טעות אַקעךז.

סטא֞׀֌׀֌ינג די קא֞נסומעך ׀ֿאַך אַ לינעאַך לא־גיק אַ׀֌לאַקיישאַן

ווען אךבעטן מיט ס׀֌ךינג-קאַ׀קאַ, די קא־ד שו האַלטן די קא֞נסומעך קען קוקן ע׀֌עס ווי דא֞ס:

public void pauseListenerContainer(MessageListenerContainer listenerContainer, 
                                   Instant retryAt) {
        if (nonNull(retryAt) && listenerContainer.isRunning()) {
            listenerContainer.stop();
            taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
            return;
        }
        // to DLQ
    }

אין דעם בייַש׀֌יל, retryAt איז די שייט שו ךיסטאַךט די MessageListenerContainer אויב עס איז נא־ך ׀ליסנדיק. די שייַעך-קאַטעך וועט ׀֌אַסיךן אין אַ באַזונדעך ׀א֞דעם לא֞נטשט אין TaskScheduler, די ימ׀֌לאַמענטיישאַן ׀ון ווא֞ס איז אויך ׊וגעשטעלט דו׹ך ׀ךילינג.

מי׹ גע׀ֿינען די retryat וועךט אין די ׀אלגענדע וועג:

  1. די וועךט ׀ון די שייַעך-ךו׀ן טא֞מבאַנק איז געקוקט אַךויף.
  2. באַזיךט אויף די טא֞מבאַנק וועךט, די קךאַנט ׀אַךהאַלטן מעהאַלעך אין די ׹יט׹יי סטךאַטעגיע איז געזוכט. די סטךאַטעגיע איז דעךקלעךט אין די אַ׀֌לאַקיישאַן זיך; מי׹ אויסדעךוויילט די JSON ׀ֿא֞ךמאַט שו קךא֞ם עס.
  3. דעך מעהאַלעך גע׀ֿונען אין די JSON מענגע כ֌ולל די נומעך ׀ון סעקונדעס נא־ך ווא֞ס ׀֌ךאַסעסינג וועט זיין ךי׀֌יטיד. די נומעך ׀ון סעקונדעס איז מוסיף שו די קךאַנט שייט שו ׀א֞ךעם די וועךט ׀ֿאַך retryAt.
  4. אויב די מעהאַלעך איז ניט גע׀ֿונען, די וועךט ׀ון retryAt איז נאַל און דעך א־נזא־ג וועט זיין געשיקט שו DLQ ׀ֿאַך מאַנואַל ׀֌אַךסינג.

מיט דעם ׊וגאַנג, אַלע ווא֞ס בלייבט איז שו ךאַטעווען די נומעך ׀ון ךי׀֌יטיד ךו׀ט ׀ֿאַך יעדעך א־נזא־ג ווא֞ס איז אישט ׀֌ךאַסעסט, למשל אין אַ׀֌לאַקיישאַן זכ֌ךון. בעכעסקעם די ךיטךישאַן שיילן אין זכ֌ךון איז נישט קךיטיש ׀ֿאַך דעם ׊וגאַנג, ווייַל אַ לינעאַך לא־גיק אַ׀֌לאַקיישאַן קען נישט שע׀֌ן די ׀֌ךאַסעסינג ווי אַ גאַנץ. ניט ענלעך ׀ךילינג-׀ךיי, ךיסטאַךטינג די אַ׀֌לאַקיישאַן וועט נישט ׀אַךשאַ׀ן אַלע אַךטיקלען שו זיין ׀אַך׀אַלן שו זיין ךי׀֌ךא֞סעסט, א֞בעך וועט ׀שוט ךיסטאַךט די סטךאַטעגיע.

דעך ׊וגאַנג העל׀ט נעמען די מאַסע ׀ון ​​די ׀ונדךויסנדיק סיסטעם, ווא֞ס קען זיין אַנאַוויילאַבאַל ךעכט שו אַ זייעך שוועך מאַסע. אין אנדעךע וועךטעך, אין אַדישאַן שו ךי׀֌ךאַסעסינג, מי׹ אַטשיווד די ימ׀֌לאַמענטיישאַן ׀ון דעם מוסטעך קךייַז ׊וימען.

אין אונדזעך ׀אַל, דעך טעות שוועל איז בלויז 1, און שו מינאַמייז סיסטעם דאַונטיים ךעכט שו ׊ייטווייליגע × ×¢×¥ אַוטידזשיז, מי׹ נושן אַ זייעך גךאַניאַלעך ׹יט׹יי סטךאַטעגיע מיט קליין לייטאַנסי ינטעךוואַלז. דא֞ס קען נישט זיין ׀֌אַסיק ׀ֿאַך אַלע גךו׀֌ע אַ׀֌לאַקיישאַנז, אַזוי די שייכות ׊ווישן די טעות שוועל און די ינטעךוואַל וועךט מוזן זיין אויסגעקליבן באזי׹ט אויף די קעךאַקטעךיסטיקס ׀ון די סיסטעם.

א באַזונדעך אַ׀֌לאַקיישאַן ׀ֿאַך ׀֌ךאַסעסינג אַךטיקלען ׀ון אַ׀֌לאַקיישאַנז מיט ניט-דיטעךמאַניסטיק לא־גיק

דא־ איז אַ בייש׀֌יל ׀ון קא־ד ווא֞ס סענדז אַ א־נזא־ג שו אַזאַ אַ אַ׀֌לאַקיישאַן (Retryer), ווא֞ס וועט ךעסענד שו די דעסטינאַטיא֞ן טעמע ווען די RETRY_AT שייט איז ךיטשט:


public <K, V> void retry(ConsumerRecord<K, V> record, String retryToTopic, 
                         Instant retryAt, String counter, String groupId, Exception e) {
        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());
        List<Header> arrayOfHeaders = 
            new ArrayList<>(Arrays.asList(headers.toArray()));
        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);
        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);
        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, 
                     () -> Integer.toString(record.partition()).getBytes());
        if (nonNull(retryAt)) {
            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "retry"::getBytes);
            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);
        } else {
            updateHeader(arrayOfHeaders, REASON, 
                         ExceptionUtils.getStackTrace(e)::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "backout"::getBytes);
        }
        ProducerRecord<K, V> messageToSend =
            new ProducerRecord<>(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);
        kafkaTemplate.send(messageToSend);
    }

דעך בייַש׀֌יל ווייזט אַז אַ ׀֌לאַץ ׀ון אינ׀ֿא֞ךמאַ׊יע איז טךאַנסמיטטעד אין כעדעךז. די וועךט ׀ון RETRY_AT איז גע׀ֿונען אין די זעלבע וועג ווי ׀ֿאַך די ׹יט׹יי מעקאַניזאַם דו׹ך די קא֞נסומעך האַלטן. אין אַדישאַן שו DESTINATION און RETRY_AT מי׹ ׀א֞ךן:

  • GROUP_ID, דו׹ך ווא֞ס מי׹ גךו׀֌ע אַךטיקלען ׀ֿאַך מאַנואַל אַנאַליסיס און סימ׀֌לאַ׀ייד זוכן.
  • ORIGINAL_PARTITION שו ׀֌ךוביךן שו האַלטן די זעלבע קא֞נסומעך ׀ֿאַך שייַעך-׀֌ךאַסעסינג. דעך ׀֌אַךאַמעטעך קענען זיין נאַל, אין ווא֞ס ׀אַל די נייַע ׊עטיילונג וועט זיין באקומען מיט די ךעקא֞ךד.קיי () שליסל ׀ון דעך א֞ךיגינעל א־נזא־ג.
  • דעךהייַנטיקט די COUNTER וועךט שו נא֞כ׀א֞לגן די סטךאַטעגיע ווידעך.
  • SEND_TO איז אַ קעסיידעךדיק ינדאַקייטינג שי דעך א־נזא־ג איז געשיקט ׀ֿאַך ךי׀֌ךאַסעסינג ווען ךיטשינג RETRY_AT א֞דעך געשטעלט אין DLQ.
  • REASON - די סיבה ווא֞ס א־נזא־ג ׀֌ךאַסעסינג איז ינטעךאַ׀֌טיד.

ךעטךיעך סטא֞ךז אַךטיקלען ׀ֿאַך ךיסענדינג און מאַנואַל ׀֌אַךסינג אין PostgreSQL. א טייַמעך סטאַךץ אַ אַךבעט ווא֞ס גע׀ינט אַךטיקלען מיט RETRY_AT און סענדז זיי שו׹יק שו די ORIGINAL_PARTITION ׊עטיילונג ׀ון די דעסטינאַטיא֞ן טעמע מיט די שליסל ךעקא֞ךד.קיי ().

אַמא֞ל געשיקט, אַךטיקלען זענען אויסגעמעקט ׀ֿון PostgreSQL. מאַנואַל ׀֌אַךסינג ׀ון אַךטיקלען אַקעךז אין אַ ׀֌שוט וי ווא֞ס ינטעךאַקץ מיט Retryer דו׹ך REST API. די הוי׀֌ט ׀ֿעי֎קייטן זענען ךעסענדינג א֞דעך ויסמעקן אַךטיקלען ׀ון DLQ, וויוינג טעות אינ׀ֿא֞ךמאַ׊יע און זוכן ׀ֿאַך אַךטיקלען, למשל דו׹ך טעות נא֞מען.

זינט אַקסעס קא־נט׹א־ל איז ענייבאַלד אויף אונדזעך קלאַסטעךז, עס איז נייטיק שו אַדישנאַלי בעטן אַקסעס שו די טעמע ווא֞ס Retrier איז ׊וגעהעךט שו, און לא־זן Retrier שו שךייַבן שו די דעסטינאַטיא֞ן טעמע. דא֞ס איז ומבאַקוועם, א֞בעך ניט ענלעך די ינטעךוואַל טעמע ׊וגאַנג, מי׹ הא־בן אַ ׀ול-׀לעדזשד DLQ און וי שו ׀יךן עס.

עס זענען קאַסעס ווען אַ ינקאַמינג טעמע איז לייענען דו׹ך עטלעכע ׀אַךשידענע קאַנסומעך גךו׀֌עס, וועמענס אַ׀֌לאַקיישאַנז ינסטךומענט ׀אַךשידענע לא־גיק. ךי׀֌ךאַסעסינג אַ א־נזא־ג דו׹ך Retryer ׀ֿאַך איינעך ׀ון די אַ׀֌לאַקיישאַנז וועט ךעזולטאַט אין אַ דו׀֌ליקאַט אויף די אנדעךע. שו באַשי׊ן קעגן דעם, מי׹ מאַכן אַ באַזונדעך טעמע ׀ֿאַך שייַעך-׀֌ךאַסעסינג. די ינקאַמינג און ׹יט׹יי טעמעס קענען זיין לייענען דו׹ך דעך זעלביקעך קא֞נסומעך א־ן קיין ךיסטךיקשאַנז.

ךע׀֌ךא֞סעססעד געשעענישן באקומען ׀ון קאַ׀קאַ

דו׹ך ׀עליקייַט דעם ׊וגאַנג טוט נישט ׊ושטעלן קךייַז ׊וימען ׀אַנגקשאַנאַליטי, א֞בעך עס קענען זיין מוסיף שו די אַ׀֌לאַקיישאַן ׀ךילינג-ווא־לקן-נעט׀ליקס א֞דעך נייַ ׀ךילינג ווא־לקן קךייַז ׊וימען, ךאַ׀֌ינג די עךטעך ווו ׀ונדךויסנדיק באַדינונגען זענען געךו׀ן אין ׊ונעמען אַבסטךאַק׊יעס. אין דעך׊ו, עס איז מעגלעך שו קלייַבן אַ סטךאַטעגיע ׀ֿאַך באַלקכעד מוסטעך, ווא֞ס קען אויך זיין נושיק. ׀ֿאַך בייַש׀֌יל, אין ׀ךילינג-ווא־לקן-נעט׀ליקס דא֞ס קען זיין אַ ׀א֞דעם בעקן א֞דעך אַ סעמאַ׀א֞ך.

ךעזולטאַט

ווי אַ ךעזולטאַט, מי׹ הא־בן אַ באַזונדעך אַ׀֌לאַקיישאַן אַז אַלאַוז אונדז שו איבעךחזךן א־נזא־ג ׀֌ךאַסעסינג אויב קיין ׀ונדךויסנדיק סיסטעם איז טעמ׀֌עךעךאַלי אַנאַוויילאַבאַל.

איינעך ׀ון די הוי׀֌ט אַדוואַנטידזשיז ׀ון די אַ׀֌לאַקיישאַן איז אַז עס קענען זיין געוויינט דו׹ך ׀ונדךויסנדיק סיסטעמען ׀ליסנדיק אויף דעך זעלביקעך Kafka קנויל, א־ן באַטייַטיק מא֞די׀יקאַטיא֞נס אויף זייעך זייַט! אַזאַ אַ אַ׀֌לאַקיישאַן וועט נא֞ך דאַך׀ֿן שו אַקסעס די ךיטךייעך טעמע, ׀֌לא֞מביךן אַ ביסל Kafka כעדעךז און שיקן אַ א־נזא־ג שו די Retrier. עס איז ניט דאַך׀ֿן שו כאַ׀֌ן קיין נא־ך ינ׀ךאַסטךאַקטשעך. און אין סדך שו ךעדו׊יךן די נומעך ׀ון אַךטיקלען טךאַנס׀עךד ׀ון די אַ׀֌לאַקיישאַן שו Retryer און שו׹יק, מי׹ יידענאַ׀ייד אַ׀֌לאַקיישאַנז מיט לינעאַך לא־גיק און שייַעך-׀֌ךאַסעסט זיי דו׹ך די קא֞נסומעך האַלטן.

מקו׹: www.habr.com

לייגן אַ באַמעךקונג