××¢××, ×××ך.
×ע׊×× ×¡ ×××
××Öž××¢×š× ×Ö·×€ÖŒ××ַק××ש×Ö·× × ×ַך××¢×× ××× ×Ö· ×××עך ק×Öž××€ÖŒ××׊××š× ×¡××××××¢. ××¢×©×¢×€× ××Öž××ק ××× ××¢×××ק×× ××× ×Ö· ××Öž××¢×š× ××¢×× ×Öž××Öž×××¢ ×Öž× ×××××, ×€×××¡× ××ק ××× ×Ö· ××֞קקעך ×××× ×עך××× ×××š× ×Ö·× ×֞ךקעס×ך×Ö·××֞ך ××× Kubernetes ×Öž×עך OpenShift, ××× ×§×Ö·×××× ×ַק××××× × ××× ×× ×עךע ×Ö·×€ÖŒ××ַק××ש×Ö·× × ×Öž×עך ×€×Ö·×š× ×¢××× × ×¡×Ö·××ש×Ö·× × ×××š× ×Ö· ק××× ×€×× ×ש×××ת ××× ×××ך×××¢× ×š×Öž××עךס. ××× ×Ö·××Ö· ×Ö· ס××××××¢, ע׀֌עס ×§×¢× ×¢× ×©××¢× ××ק ×ךע××, ×Ö·××× ×š×׀֌ך×ַסעס×× × ××¢×©×¢×¢× ××©× ×××× ×××× ×¢×š ×€×× ×× ×€×× ×ך×××¡× ××ק ס×ס××¢××¢× ××× ×Ö·× ×Ö·××××××Ö·××Ö·× ××× ×Ö· ××××××ק ×××× ×€×× ××× ××עך ××¢×©×¢×€× ×€ÖŒ×š×ַסעס×Ö·×.
××× ×¢×¡ ××× ××¢×××¢× ××××עך ק×ַ׀ק×Ö·
׀ך×עך ××× ×× ×€ÖŒ×š××עק×, ××ך ××¢××××× × IBM MQ ×€Ö¿×ַך ××ס×× ×קך×Ö·× ×ַס ×Öž× ××Öž× ×¢×§×¡×€ÖŒ×š×¢×¡. ×××× ×§××× ××¢×ת ××× ×€×ך×עק×××¢× ×עש×ַס ×× ×֞׀֌עך×ַ׊××¢ ×€×× ââââ×× ×¡×¢×š×××ס, ×× ××ק×××¢× ×Öž× ××Öž× ×§×¢× ×××× ×עש××¢×× ××× ×Ö· ××××-×ך×××-ך×× (DLQ) ×€Ö¿×ַך ××××Ö·×עך ××Ö·× ××Ö·× ×€ÖŒ×ַךס×× ×. ×× DLQ ××× ××¢×××¢× ××ש××€× ××××Ö·×עך ×Š× ×× ×× ×§×Ö·××× × ×š××, ×עך ×Öž× ××Öž× ××× ×ך×Ö·× ×¡×€×¢×š× ××× IBM MQ.
×××× ×עך ××¢×ת ××× ××¢×××¢× ×Š××Ö·×××××Ö·××ק ××× ××ך ×§×¢× ××ַש×××¡× ×¢×¡ (××ש×, ×Ö· ResourceAccessException ××××£ ×Ö· ××××€ÖŒ ך××€× ×Öž×עך ×Ö· MongoTimeoutException ××××£ ×Ö· MongoDb ××¢××), ×× ×š××ך×× ×¡×ך×Ö·××¢×××¢ ×××Öž×× × ×¢××¢× ×××ךק×× ×. ךע××ַך××עסס ×€×× ×× ×ך×Ö·× ×ש×× × ××Öž××ק ×€×× ×× ×Ö·×€ÖŒ××ַק××ש×Ö·×, ×עך ×֞ך×××× ×¢× ×Öž× ××Öž× ××× ×ך××עך××¢×€××š× ×Öž×עך ×Š× ×× ×¡×ס××¢× ×š×× ×€Ö¿×ַך ×××××× ×©×ק×, ×Öž×עך ×Š× ×Ö· ××Ö·××× ×עך ×Ö·×€ÖŒ××ַק××ש×Ö·× ×××֞ס ××× ××¢×××¢× ××¢×××× ××Ö·× × ×Š×ך×ק ×Š× ×©××§× ×ַך××ק××¢× ××××עך. ××֞ס ×××× ×Ö· ך××¡×¢× × × ××עך ××× ×× ×Öž× ××Öž× ××¢×עך, ×××֞ס ××× ×××× ×Š× ×× ×€×ַך××Ö·××× ××¢××Ö·××¢× ×Öž×עך ×× ×¡××£ ×€×× ×× ×Ö·×€ÖŒ××ַק××ש×Ö·×-××ך×× ×¡×ך×Ö·××¢×××¢. ×××× ××ך ××Öž×× ×š×××©× ×× ×¡××£ ×€×× ×× ×¡×ך×Ö·××¢×××¢ ×Öž×עך ×× ×€×× ×ך×××¡× ××ק ס×ס××¢× ××× × ×Öž× ×Ö·× ×Ö·××××××Ö·××Ö·×, ×עך ×Öž× ××Öž× ×××¢× ×××× ×עש××¢×× ××× ×× DLQ ×€Ö¿×ַך ××Ö·× ××Ö·× ×€ÖŒ×ַךס×× ×.
××¢×€Ö¿×× ×¢× ×Ö· ×××××× ×
×ך×Öž×¥ ×× ×ך××ס × ××עך ×€×× positive ××ך××××, עס ×××× × ×Š× ××ך × ××©× ××֞ך ×עך×Öž××. עךש×עך ×€×× ×Ö·××¢, ××××Ö·× ×× ××¢×××¢××֞׀֌עך, ××× ×Ö·××ש×Ö·× ×Š× ×××€ÖŒ××Ö·××¢× ×× × ××¢×©×¢×€× ×š×¢×§×××ךע××¢× ×¥, ×××¢× ××Öž×× ×Š× ×€×ַך××š×¢× ××¢× ×Ö· ×€ÖŒ××Ö·×¥ ×€×× ×Š××Ö·× ×××€ÖŒ××Ö·××¢× ×× × ×× ××סקך×××× ×עק×Ö·× ×××Ö·×.
××× ×Ö·××ש×Ö·×, ×××× ×ַקסעס ק×Öž× ×ך×Öž× ××× ×¢× ××××Ö·×× ××××£ ×× Kafka ×§× ×××, ××ך ×××¢× ××Öž×× ×Š× ×€×ַך××š×¢× ××¢× ×¢×××¢××¢ ××Öž× ×Š× ×©×Ö·×€Ö¿× ××¢×עס ××× ×Š×ש××¢×× ×× × ××××ק ×ַקסעס ×Š× ×××. ××× ×Ö·××ש×Ö·× ×Š× ××¢×, ××ך ×××¢× ××Ö·×š×€Ö¿× ×Š× ×××סק×××Ö·×× ××¢× ×š××××ק ךע××¢× ×××Öž×.×ס ×€ÖŒ×ַך×Ö·××¢×עך ×€Ö¿×ַך ××¢×עך ×€×× ×× ×š×¢×¡×Ö·×€ÖŒ×× ××¢×עס ×Ö·××× ×Ö·× ×ַך××ק××¢× ××Öž×× ×Š××× ×Š× ×€×ַך×ך××¡× ××× ××Öž× × ×× ×€×ַךש×××× ×× ×€×× ×¢×¡. ×× ×××€ÖŒ××Ö·××¢× ×××ש×Ö·× ××× ××¢×× ×€×× ×ַקסעס ×××¢× ×××× ×š××€ÖŒ×××× ×€Ö¿×ַך ××¢×עך ××××ס××× × ×Öž×עך × ××Ö· ××× ×¡×.
××Öž××ך ×××Š× ××¢× ×××֞ס ×עק×Ö·× ×××Ö·×× ×€×š×××× × ××× ×Ö·×××¢×××× ××× ×€×š×××× ×-ק×ַ׀ק×Ö· ××× ××Ö·××× ×עך ׊×ש××¢×× ××× ×× ×€Ö¿×ַך ×Öž× ××Öž× ×š×׀֌ך×ַסעס×× ×. Spring-kafka ××× ×Ö· ×ך×Ö·× ×××××× ××¢×€ÖŒ×¢× ××¢× ×¡× ××××£ ׀ך×××× ×-׀ֿך××Ö·, ×××֞ס ××× ×Ö·×ס×ך×ַק׊×עס ×€Ö¿×ַך ×Öž× ×€×ך×× × ×€×ַךש×××¢× ×¢ BackOffPolicies. ××֞ס ××× ×Ö· ׀עך×× ×€×עקס×Ö·××Ö·× ×ע׊××Ö·×, ×Öž×עך ×××× ××Ö·×××××ק ש×עך×× × ××× ×¡××֞ך×× × ×ַך××ק××¢× ×€Ö¿×ַך ך××¡×¢× ××× × ××× ×Ö·×€ÖŒ××ַק××ש×Ö·× ××֌ך××. ××¢× ×××× ×Ö·× ×š×ס××ַך××× × ×× ×Ö·×€ÖŒ××ַק××ש×Ö·× ×š×¢×× ×Š× ×Ö· ×עך×××Ö·× ×××§× ×Öž×עך ×Ö· ×ַ׀֌עך××ש×Ö·× ×Ö·× ××¢×ת ×××¢× ×š×¢×××××Ö·× ××× ×× ×Öž× ××עך ×€×× ×Ö·××¢ ×ַך××ק××¢× ×€ÖŒ×¢× ××× × ×š×׀֌ך×ַסעס×× ×. ××× × ××¢× ×€×× × ××× ×§×š×××ש ×€Ö¿×ַך ××× ××עך ס×ס××¢×, ××ך ××Öž×× × ××©× ××Ö·×ך×Ö·××× ×¢×¡ ××××Ö·×עך.
ס׀֌ך×× ×-ק×ַ׀ק×Ö· ××× ××× ×¢×××¢××¢ ×××€ÖŒ××Ö·××Ö·× ×¥ ×€×× ContainerAwareErrorHandler, ××ש×
×עך ׊×××Ö·× × ×Ö·××Ö·×× ×š×¢×€ÖŒ×š×Öž×¡×¢×¡×¡×¢× ×ַך××ק××¢× ×Š× ××××Ö·×× ××¢×× ×Ö·×€ÖŒ××ַק××ש×Ö·× ×š×ס××ַך×, ×Öž×עך עס ××× × ×Öž× ×§××× 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 ×××¢×š× ××× ×× ×€××××¢× ××¢ ×××¢×:
- ×× ×××¢×š× ×€×× ×× ×©××Ö·×¢×-ך××€× ××Öž×××Ö·× ×§ ××× ×עק××§× ×ַך×××£.
- ××Ö·×××š× ××××£ ×× ××Öž×××Ö·× ×§ ××עך×, ×× ×§×š×Ö·× × ×€×ַך××Ö·××× ××¢××Ö·××¢× ××× ×× ×š××ך×× ×¡×ך×Ö·××¢×××¢ ××× ××¢××××. ×× ×¡×ך×Ö·××¢×××¢ ××× ×עךק××¢×š× ××× ×× ×Ö·×€ÖŒ××ַק××ש×Ö·× ×××; ××ך ×××ס×עך×××××× ×× JSON ×€Ö¿×֞ך××Ö·× ×Š× ×§×š×Öž× ×¢×¡.
- ×עך ××¢××Ö·××¢× ××¢×€Ö¿×× ×¢× ××× ×× JSON ××¢× ××¢ ×ÖŒ××× ×× × ××עך ×€×× ×¡×¢×§×× ×עס × ×Öž× ×××֞ס ׀֌ך×ַסעס×× × ×××¢× ×××× ×š××€ÖŒ××××. ×× × ××עך ×€×× ×¡×¢×§×× ×עס ××× ××ס××£ ×Š× ×× ×§×š×Ö·× × ×Š××× ×Š× ×€×Öž×š×¢× ×× ×××¢×š× ×€Ö¿×ַך retryAt.
- ×××× ×× ××¢××Ö·××¢× ××× × ×× ××¢×€Ö¿×× ×¢×, ×× ×××¢×š× ×€×× 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