introduction
Parfois, le même message de demande est livré plus d’une fois. Il se peut que le destinataire du message ne soit pas sûr que le message ait été remis avec succès ou non, ou il se peut que le code ne soit pas configuré pour vérifier les doublons.
Pour se débarrasser des doublons, nous devons adapter un design pattern idempotent, qui enverra des messages uniques au système.
Mulesoft a fourni le idempotent-message-validator
composant, et nous pouvons facilement y parvenir sans trop de codage.
J’ai préparé un POC simple pour décrire comment utiliser le idempotent-message-validator
composant pour restreindre la charge utile des demandes en double entrantes dans l’API Mule 4.
Exigence
Dans tout projet, il est essentiel de traiter une charge utile de requête unique.
Dans ce POC, nous exécuterons le flux avec succès s’il n’y a pas d’identifiant d’e-mail en double dans les demandes.
POC
» data-lang= »application/xml »>
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:os="http://www.mulesoft.org/schema/mule/os" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:apikit="http://www.mulesoft.org/schema/mule/mule-apikit" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/mule-apikit http://www.mulesoft.org/schema/mule/mule-apikit/current/mule-apikit.xsd http://www.mulesoft.org/schema/mule/os http://www.mulesoft.org/schema/mule/os/current/mule-os.xsd">
<http:listener-config name="duplicate-check-httpListenerConfig">
<http:listener-connection host="${http.private.host}" port="${http.private.port}" />
</http:listener-config>
<apikit:config name="duplicate-check-config" api="duplicate-check-api.raml" outboundHeadersMapName="outboundHeaders" httpStatusVarName="httpStatus" />
<configuration-properties doc:name="Configuration properties" doc:id="18cff226-2fbc-44ed-8053-420aa52d5165" file="properties/${mule.env}-properties.yaml" />
<flow name="duplicate-check-main">
<http:listener config-ref="duplicate-check-httpListenerConfig" path="${http.private.path}">
<reconnect frequency="${http.private.reconnect.frequency}" count="${http.private.reconnect.attempts}"/>
<http:response statusCode="#[vars.httpStatus default 200]">
<http:headers><![CDATA[#[vars.outboundHeaders default {}]]]></http:headers>
</http:response>
<http:error-response statusCode="#[vars.httpStatus default 500]">
<http:body><![CDATA[#[payload]]]></http:body>
<http:headers><![CDATA[#[vars.outboundHeaders default {}]]]></http:headers>
</http:error-response>
</http:listener>
<apikit:router config-ref="duplicate-check-config" />
</flow>
<flow name="post:user_register:duplicate-check-config">
<flow-ref doc:name="check-duplicate-message" doc:id="f708d25c-923a-43ca-8551-64858be9e982" name="check-duplicate-message"/>
<ee:transform doc:name="Store the information successfully" doc:id="313b0077-13ba-4bf9-b0c5-122e4616cb08" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
"message" : "User details stored successfully."
}]]></ee:set-payload>
</ee:message>
</ee:transform>
<error-handler >
<on-error-propagate enableNotifications="true" logException="true" doc:name="On Error Propagate" doc:id="a52c6ae8-a8f5-4300-aa9a-4a43b45e0d83" type="ANY">
<ee:transform doc:name="Prepare Error Payload" doc:id="f0f65cbf-fa19-48fb-ad02-6e63ea1424af" >
<ee:message >
<ee:set-payload resource="dwl/prepareError.dwl" />
</ee:message>
</ee:transform>
</on-error-propagate>
</error-handler>
</flow>
<sub-flow name="check-duplicate-message" doc:id="1ce86c01-2e24-49b3-bf17-764747a252b8" >
<set-variable value="#[%dw 2.0
output application/json
---
write(payload.email,"application/json")]" doc:name="Set email variable" doc:id="4c342f3b-be44-4b10-86a6-949b3717180a" variableName="uniqueEmailCheck" mimeType="application/json"/>
<idempotent-message-validator doc:name="Idempotent Message Validator" doc:id="744f1b97-4ef7-4206-acca-1c4cdcaedaa8" idExpression="#[%dw 2.0
output text/plain
import dw::Crypto
---
Crypto::hashWith(vars.uniqueEmailCheck as Binary,'SHA-1')]">
<os:private-object-store entryTtl="${duplicate_check_os.entry_ttl}" expirationInterval="${duplicate_check_os.expiration_interval}" expirationIntervalUnit="DAYS" entryTtlUnit="DAYS" />
</idempotent-message-validator>
<remove-variable doc:name="Remove Variable" doc:id="71d94db7-d7bc-4506-b835-419dc59727c5" variableName="uniqueEmailCheck"/>
</sub-flow>
</mule>
Référence Git
Vous pouvez trouver le code exécutable complet ici, et pour tester le POC, le script postman est ici.
Tester la sortie
Scénario heureux (première demande)
Pour la première demande où l’e-mail est nouveau, il acceptera la demande et répondra comme ceci :
Scénario d’erreur (deuxième demande avec la même charge utile)
Pour la deuxième demande où l’identifiant de l’e-mail est le même que la première, cela générera une erreur par le idempotent-message-validator
composant et nous pouvons préparer la sortie comme ceci :
Conclusion
Ce POC est juste pour donner une idée de la idempotent-message-validator
composant. Il peut être amélioré selon vos besoins.
Un point important de ce composant est qu’il utilise ObjectStore
pour conserver les enregistrements, nous devons donc tenir compte du coût et de l’utilisation de la mémoire lors de la conception.