JLupin in-memory queue implementation

Overview

Figure 1. In-memory queue.

Every microservice stores data in memory. Because repsonse from microservice may not be sent to same instance as the request, queue microservices are communicationg with each other, to keep data consistent.

Usage

You must change configuration for calling microserivce, main server, queue microservice and microservice with service defintion.

Calling microservice

You must setup queue delegator for sending task with localhost load balancer. To do so updated your Spring configuration with below beans configuration:

@Configuration
@ComponentScan({"com.jlupin.impl.microservice.samplenative"})
public class MicroserviceApplicationConfiguration {

    @Bean
    public JLupinLogger getJLupinLogger() {
         return JLupinSystemContainer.getInstance().getJLupinLogger();
    }

    @Bean
    public JLupinServiceRepository getJLupinServiceRepository() {
        return JLupinClientUtil.generateServiceRepository(5000, JLupinServiceRepositoryType.INNER_MICROSERVICE, null,
                                                          new JLupinServiceRepositoryConnectionToServerConfiguration(), getJLupinLogger());
    }

    @Bean("jlrmcDelegator")
    public JLupinDelegator getJLRMCDelegator() {
        JLupinLoadBalancer jLupinPriorityLoadBalancer = JLupinClientUtil.generateLoadBalancer(getJLupinServiceRepository(), 3, 5000,
                                                        JLupinClientUtil.JLupinLoadBalancerAlgorithmType.PRIORITY, getJLupinLogger());
        return JLupinClientUtil.generateLoadBalancerDelegator(PortType.JLRMC, jLupinPriorityLoadBalancer);
    }

    @Bean("queueDelegator")
    public JLupinDelegator getQueueDelegator() {
        JLupinLoadBalancer jLupinLocalhostLoadBalancer = JLupinClientUtil.generateLoadBalancer(getJLupinServiceRepository(), 3, 5000,
                                                         JLupinClientUtil.JLupinLoadBalancerAlgorithmType.LOCALHOST, getJLupinLogger());
        return JLupinClientUtil.generateLoadBalancerDelegator(PortType.QUEUE, jLupinLocalhostLoadBalancer);
    }

}

Important here is that the service repository instance is shared between all load balancers.

Main server

Update your main.yml file to setup load balancers for queue protocol:

[...]
PROCESS_MANAGER:
  [...]
  LOAD_BALANCER_SETTINGS:
    [...]
    QUEUE_PROTOCOL_SETTINGS:
      ALGORITHM:
        type: localhost
      PROPERTIES:
        changeServerIntervalInMillis: 5000
[...]

With this configuration load balancer will look for queue microservice only on localhost.

Queue microservice

Update your configuration.yml file to setup load balancers for queue protocol:

[...]
ENTRY_POINTS:
  [...]
  QUEUE:
    [...]
    LOAD_BALANCER_SETTINGS:
      ALGORITHM:
        type: localhost
      PROPERTIES:
        changeServerIntervalInMillis: 5000
        repeatsAmount: 3
[...]

Microservice with service called by queue

Update your configuration.yml file to setup load balancers for queue protocol:

[...]
ENTRY_POINTS:
  [...]
  QUEUE:
    [...]
    LOAD_BALANCER_SETTINGS:
      ALGORITHM:
        type: localhost
      PROPERTIES:
        changeServerIntervalInMillis: 5000
        repeatsAmount: 3
[...]

Storage type configuration

[...]
    storageClassName: 'com.jlupin.impl.microservice.partofjlupin.asynchronous.storage.queue.impl.memory.JLupinMemoryQueueStorageImpl'
[...]

This implementation is enabled by default.