Show / Hide Table of Contents
    Note

    These docs are a work in progress. While conceptually correct, the diagrams/code samples on this page might not be 100% in line with the current implementation in Copper.

    Transports

    Modes

    • One-way (simplex)
    • Request/response (request-reply)
    • Events


    Designs

    Proxy - Client SDK

    The use of proxies is a vital part of the inner working of Copper. It is what enables us to inject behaviors such as diagnostics, operation context and allow for user extensibility. It also decouples the user code, business logic, from any transport specific code.

    As shown below, the proxy Copper uses a proxy without target for the client SDK. It adds a transport specific interceptor at the end, which enables switching transports without changing business logic or any other injected behavior.

    Each of the different transports have their own implementation for this Transport client interceptor.


    Listeners - Service SDK

    Copper adheres to the same concepts as Azure Service Fabric. This means that it also has a listener concept. The concept of a listener is that you can expose a service via a listener, allowing it to receive requests from external parties.

    Although the Azure Service Fabric implementation is very loose on the ICommunicationListener interface. E.g. this only has Open, Close and Abort. The listener concept in Copper is geared towards exposing a specific service through one of its facets (interface).


    Messaging

    Properties:

    • Queued interaction mode
      • Request/Response
      • One-way request
      • Events
    • Message Bus abstraction
      • MassTransit


    Location transparency

    The main benefit of location transparency is that it no longer matters where the resource is located. Because both parties connect to the same endpoint, the message bus, the exact location of a service is not needed, giving lots of flexibility in terms of hosting, and networking.

    Competing consumer

    Use a message queue to implement the communication channel between the application and the instances of the consumer service. The application posts requests in the form of messages to the queue, and the consumer service instances receive messages from the queue and process them. This approach enables the same pool of consumer service instances to handle messages from any instance of the application. The figure illustrates using a message queue to distribute work to instances of a service.

    |||


    Tooling

    Sometimes there is the need to move messages from one queue to the next. E.g. re-submitting deadlettered messages to the live queue.

    • RabbitMQ Shovel plugin
    • Service Bus Explorer


    • Improve this Doc
    Back to top Generated by DocFX