Kia ora, Habr.
I tata nei ahau
Ko nga tono hou e mahi ana i roto i te taiao tino uaua. Ko te arorau pakihi kua takai ki roto i te putunga hangarau hou, e rere ana i roto i te ahua Docker e whakahaeretia ana e tetahi kaikorero penei i a Kubernetes, OpenShift ranei, me te korero ki etahi atu tono, otinga hinonga ranei na roto i te mekameka o nga pouara tinana me te mariko. I roto i te taiao penei, ka pakaru tonu tetahi mea, na reira ko te tukatuka ano i nga huihuinga mena karekau tetahi o nga punaha o waho he waahanga nui o a maatau mahi pakihi.
Pehea i mua i a Kafka
I mua o te kaupapa i whakamahia e matou te IBM MQ mo te tuku karere tukutahi. Mena i puta he hapa i te wa e whakahaere ana te ratonga, ka taea te tuku i te karere kua tae mai ki roto i te rarangi-reta-tutira (DLQ) mo etahi atu porotiti a-ringa. I hangaia te DLQ ki te taha o te rarangi taumai, i whakawhitia te karere ki roto IBM MQ.
Mena he wa poto te hapa ka taea e matou te whakatau (hei tauira, he ResourceAccessException i runga i te waea HTTP, i te MongoTimeoutException ranei i runga i te tono MongoDb), ka whai mana te rautaki ngana ano. Ahakoa te arorau peka o te tono, i nukuhia te karere taketake ki te rarangi punaha mo te wa roa te tuku, ki tetahi tono motuhake i mahia i mua noa atu hei tuku ano i nga karere. Kei roto i tenei ko te nama tuku ano i roto i te pane o te karere, kua herea ki te waahi whakaroa, ki te mutunga ranei o te rautaki taumata-tono. Mena kua tae tatou ki te mutunga o te rautaki engari kaore i te waatea te punaha o waho, katahi ka tukuna te karere ki roto i te DLQ mo te panui a-ringa.
Rangahau rapu
Ahakoa te maha o nga arotake pai, ki ahau nei kaore i tino angitu. Tuatahi, na te mea ko te kaiwhakawhanake, i tua atu i te whakatinana i nga whakaritenga pakihi, me whakapau kaha ki te whakatinana i te tikanga kua whakaahuatia.
I tua atu, ki te whakahohea te mana uru ki runga i te roopu Kafka, me noho koe ki te hanga kaupapa me te whakarato i te urunga e tika ana ki a raatau. I tua atu i tenei, me kowhiria e koe te tawhā pupuri.ms tika mo ia kaupapa ngana ano kia whai taima nga karere kia kore e ngaro atu. Ko te whakatinanatanga me te tono urunga me whakahoki ano mo ia ratonga o mua, hou ranei.
Inaianei kia kite tatou he aha nga tikanga o te puna i te nuinga o te waa me te puna-kafka e whakarato ana ki a tatou mo te tukatuka karere. Ko te puna-kafka he ti'aturi tauwhiro ki te ngana ano i te puna, e whakarato ana i nga tangohanga mo te whakahaere i nga momo BackOffPolicies. He taputapu tino ngawari tenei, engari ko tana raru nui ko te penapena i nga karere mo te tuku ano i roto i te mahara tono. Ko te tikanga ko te whakaara ano i te tono na te mea he whakahou, he hapa whakahaere ranei ka ngaro nga karere katoa e tatari ana ki te tukatuka ano. I te mea he mea tino nui tenei waahanga mo ta maatau punaha, kaore i whakaarohia e maatau.
Ko te puna-kafka ake e whakarato ana i etahi whakatinanatanga o ContainerAwareErrorHandler, hei tauira
Ma tenei huarahi ka taea e nga karere kua tukatukahia kia ora i te tiimata ano o te tono, engari karekau he tikanga DLQ. I whiriwhiria e matou tenei whiringa i te timatanga o te tau 2019, me te tino whakapono karekau e hiahiatia te DLQ (he waimarie matou, a, kaore i hiahiatia i muri i nga marama maha o te whakahaere i te tono me taua punaha tukatuka). Na nga hapa rangitahi i pa ai a SeekToCurrentErrorHandler. Ko nga hapa e toe ana i taia ki roto i te raarangi, ka puta he waahi, ka haere tonu te tukatuka me te karere e whai ake nei.
Te whakatau whakamutunga
Ko te whakatinanatanga i runga i SeekToCurrentErrorHandler i akiaki i a maatau ki te whakawhanake i a maatau ake tikanga mo te tuku karere.
Tuatahi, i hiahia matou ki te whakamahi i te wheako o naianei me te whakawhānui ake i runga i te arorau tono. Mo te tono arorau rarangi, he mea pai kia mutu te panui i nga karere hou mo te wa poto kua tohua e te rautaki ngana ano. Mo etahi atu tono, i pirangi au ki te whai i tetahi tohu hei whakamana i te rautaki ngana ano. I tua atu, me whai mahi DLQ tenei tohu kotahi mo nga huarahi e rua.
Ko te rautaki ngana ano me penapena ki roto i te tono, kei a ia te kawenga mo te whakahoki mai i te waa e whai ake nei ina puta he hapa rangitahi.
Whakamutua te Kaihoko mo te Taupānga Ararau Raina
I te wa e mahi ana me te puna-kafka, he penei te ahua o te waehere hei aukati i te Kaihoko:
public void pauseListenerContainer(MessageListenerContainer listenerContainer,
Instant retryAt) {
if (nonNull(retryAt) && listenerContainer.isRunning()) {
listenerContainer.stop();
taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
return;
}
// to DLQ
}
Hei tauira, ko te retryAt te wa ki te whakaara ano i te MessageListenerContainer mena kei te haere tonu. Ko te whakarewatanga ano ka puta i roto i tetahi miro motuhake i whakarewahia i roto i te TaskScheduler, ko te whakatinanatanga ka tukuna ano e te puna.
Ka kitea e matou te uara retryAt penei:
- Ka tirohia ake te uara o te porotiti karanga.
- I runga i te uara porotiti, ka rapua te waahi whakaroa i roto i te rautaki ngana ano. Ko te rautaki i whakapuakihia i roto i te tono ake; i whiriwhiria e matou te whakatakotoranga JSON hei penapena.
- Ko te waahi ka kitea i roto i te raupapa JSON kei roto te maha o nga hēkona i muri i te tukatuka me tukurua. Ka taapirihia tenei maha o nga hēkona ki te wa o naianei hei hanga i te uara mo te retryAt.
- Mena kaore i kitea te waahi, ka kore te uara o te retryAt ka tukuna te karere ki te DLQ mo te poroporo a-ringa.
Ma tenei huarahi, ko nga mea e toe ana ko te penapena i te maha o nga waea tukurua mo ia karere e whakahaerea ana i tenei wa, hei tauira i te mahara tono. Ko te pupuri i te tatau ngana ano i roto i te mahara ehara i te mea nui mo tenei huarahi, na te mea kaore e taea e te tono arorau rarangi te whakahaere i te katoa o te tukatuka. Kaore i rite ki te ngana ano i te puna, ko te whakaara ano i te tono ka kore e ngaro nga karere katoa ki te tukatuka ano, engari ka timata ano te rautaki.
Ka awhina tenei huarahi ki te tango i te kawenga mai i te punaha o waho, kaore pea i te waatea na te taumaha rawa o te kawenga. Arā, i tua atu i te tukatuka anō, i tutuki i a mātou te whakatinanatanga o te tauira
I roto i a maatau, ko te paepae hapa he 1 anake, me te whakaiti i te wa paheketanga o te punaha na te korenga o te whatunga rangitahi, ka whakamahia e matou he rautaki ngana ano me nga waahi iti. Kaore pea tenei e pai mo nga tono roopu katoa, na reira me whiriwhiri te hononga i waenga i te paepae hapa me te uara waahi i runga i nga ahuatanga o te punaha.
He tono motuhake mo te tukatuka karere mai i nga tono me te arorau kore-whakarite
Anei tetahi tauira o te waehere e tuku karere ana ki taua tono (Kaiwhakahou), ka tukuna ano ki te kaupapa DESTINATION ina tae ki te wa 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);
}
Ko te tauira e whakaatu ana he maha nga korero ka tukuna i roto i nga pane. Ko te uara o RETRY_AT ka kitea he rite tonu ki te tikanga mo te ngana ano ma te aukati Kaihoko. I tua atu ki DESTINATION me RETRY_AT ka paahitia e matou:
- GROUP_ID, ma reira ka whakarōpū karere mo te tātari a-ringa me te rapu ngawari.
- ORIGINAL_PARTITION ki te ngana ki te pupuri i taua Kaihoko mo te tukatuka ano. Ka taea te whakakore i tenei tawhā, i roto i tenei take ka whiwhi te wehewehenga hou ma te whakamahi i te record.key() o te karere taketake.
- Kua whakahoutia te uara COUNTER hei whai i te rautaki ngana ano.
- Ko te SEND_TO he tohu tonu mena ka tukuna te karere hei tukatuka ano ina tae ki RETRY_AT, ka tuu ranei ki DLQ.
- TE WHAKAMAHI - te take i haukotia ai te tukatuka karere.
Ka penapenahia nga karere a Retryer mo te tuku ano me te poroporo a-ringa ki PostgreSQL. Ka timata te taima i tetahi mahi ka kitea nga karere me RETRY_AT ka whakahokia ki te wehenga ORIGINAL_PARTITION o te kaupapa DESTINATION me te record.key().
Ina tukuna, ka mukua nga karere mai i te PostgreSQL. Ko te poroporoaki a-ringa o nga karere ka puta i roto i te UI ngawari e mahi tahi ana me te Kai-whakahou ma te REST API. Ko ona ahuatanga matua ko te tuku, te whakakore ranei i nga karere mai i te DLQ, te tiro i nga korero hapa me te rapu karere, hei tauira ma te ingoa hapa.
I te mea kua whakahohea te mana uru ki runga i a tatou tautau, me tono taapiri mo te kaupapa e whakarongo ana a Retryer, me te tuku a Retryer ki te tuhi ki te kaupapa DESTINATION. He maamaa tenei, engari, kaore i rite ki te huarahi kaupapa mo te waahi, kei a maatau te DLQ me te UI ki te whakahaere.
He keehi ka panuihia tetahi kaupapa taumai e te maha o nga roopu kaihoko rereke, na o raatau tono ka whakatinana i nga whakaaro rereke. Ko te tukatuka ano i tetahi karere na roto i te Kai-whakahou mo tetahi o enei tono ka puta he taarua ki tetahi atu. Hei whakamarumaru i tenei, ka hangaia e matou he kaupapa motuhake mo te tukatuka ano. Ka taea e te Kaihokohoko te panui nga kaupapa taumai me te ngana ano me te kore he here.
Ma te taunoa karekau tenei huarahi e whakarato i te taumahinga wehenga ara iahiko, heoi ka taea te taapiri atu ki te tono ma te whakamahi
mutunga
Ko te mutunga mai, he tono motuhake ta matou ka taea e matou te whakahoki ano i te tukatuka karere mena karekau he punaha o waho mo te wa poto.
Ko tetahi o nga painga nui o te tono ka taea te whakamahi e nga punaha o waho e rere ana i runga i te roopu Kafka kotahi, kaore he whakarereketanga nui i to raatau taha! Ko te tono pera me uru ki te kaupapa ngana ano, whakakiia etahi pane Kafka ka tukuna he karere ki te Kaipupuri. Kaore he take ki te whakaara i etahi atu hanganga. A, hei whakaiti i te maha o nga karere i whakawhitia mai i te tono ki te Retryer me te hoki, i tautuhia e matou nga tono me te arorau rarangi me te tukatuka ano i a raatau ma te aukati Kaihoko.
Source: will.com