DéveloppeurWeb.Com
    DéveloppeurWeb.Com
    • Agile Zone
    • AI Zone
    • Cloud Zone
    • Database Zone
    • DevOps Zone
    • Integration Zone
    • Web Dev Zone
    DéveloppeurWeb.Com
    Home»Integration Zone»Modèle de conception idempotent dans Mule 4
    Integration Zone

    Modèle de conception idempotent dans Mule 4

    novembre 3, 2021
    Modèle de conception idempotent dans Mule 4
    Share
    Facebook Twitter Pinterest Reddit WhatsApp Email

    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 :Capture d'écran du scénario heureux

    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 :Capture d'écran du scénario d'erreur

    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.

    Share. Facebook Twitter Pinterest LinkedIn WhatsApp Reddit Email
    Add A Comment

    Leave A Reply Cancel Reply

    Catégories

    • Politique de cookies
    • Politique de confidentialité
    • CONTACT
    • Politique du DMCA
    • CONDITIONS D’UTILISATION
    • Avertissement
    © 2023 DéveloppeurWeb.Com.

    Type above and press Enter to search. Press Esc to cancel.