UBC Faculty Research and Publications

Improving microservice-based applications with runtime placement adaptation Sampaio, Adalberto R; Rubin, Julia; Beschastnikh, Ivan; Rosa, Nelson S Feb 26, 2019

Your browser doesn't seem to have a PDF viewer, please download the PDF to view this item.

Item Metadata


52383-13174_2019_Article_104.pdf [ 4.64MB ]
JSON: 52383-1.0376541.json
JSON-LD: 52383-1.0376541-ld.json
RDF/XML (Pretty): 52383-1.0376541-rdf.xml
RDF/JSON: 52383-1.0376541-rdf.json
Turtle: 52383-1.0376541-turtle.txt
N-Triples: 52383-1.0376541-rdf-ntriples.txt
Original Record: 52383-1.0376541-source.json
Full Text

Full Text

Journal of Internet Servicesand ApplicationsSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 https://doi.org/10.1186/s13174-019-0104-0RESEARCH Open AccessImproving microservice-basedapplications with runtime placementadaptationAdalberto R. Sampaio Jr.1* , Julia Rubin2, Ivan Beschastnikh3 and Nelson S. Rosa1AbstractMicroservices are a popular method to design scalable cloud-based applications. Microservice-based applications(μApps) rely on message passing for communication and to decouple each microservice, allowing the logic in eachservice to scale independently.Complex μApps can contain hundreds of microservices, complicating the ability of DevOps engineers to reasonabout and automatically optimize the deployment. In particular, the performance and resource utilization of a μAppdepends on the placement of the microservices that compose it. However, existing tools for μApps, like Kubernetes,provide minimal ability to influence the placement and utilization of a μApp deployment.In this paper, we first identify the runtime aspects of microservice execution that impact the placement ofmicroservices in a μApp. We then review the challenges of reconfiguring a μApp based on these aspects. Our maincontribution is an adaptation mechanism, named REMaP, to manage the placement of microservices in anμApp automatically. To achieve this, REMaP uses microservice affinities and resource usage history. We evaluate ourREMaP prototype and demonstrate that our solution is autonomic, lowers resource utilization, and can substantiallyimprove μApp performance.Keywords: Microservices, Runtime adaptation, Optimization1 IntroductionAs business logic moves into the cloud, developers needto orchestrate not just the deployment of code to cloudresources but also the distribution of this code onthe cloud platform. Cloud providers offer pay-as-you-goresource elasticity, and virtually infinite resources, such asCPU, memory, disk, and network bandwidth. The man-agement of these cloud resources, however, is a majorchallenge, leading to new roles like DevOps engineers.In this context, microservices have become an essentialmechanism to provide the necessary deployment flexi-bility and at the same time take advantage of abundantresources [1].A microservice is a decoupled and autonomic soft-ware, having a specific functionality in a bounded con-text. The decoupling and well-defined interfaces provide*Correspondence: arsj2@cin.ufpe.br1Center of Informatics, UFPE, Recife, BrazilFull list of author information is available at the end of the articlethe ability for microservice-based applications (μApps)to scale in/out seamlessly and for developers to performupgrades by deploying new service versions, all withouthalting the μApp. The decoupling also allows microser-vices to be developed using different programming lan-guages.Despite the many similarities between services andmicroservices [2], there are some fundamental differ-ences, mainly related to their execution. Languages likeWS-BPEL1 describe the workflow of service composi-tions. By contrast, a μApp workflow is not formally spec-ified. The μApp communication must be monitored toinfer the underlying workflow.A downside of using microservices is their managementcomplexity. A microservice may have different behaviourswhile it executes, which is reflected in both the volatil-ity of resource usage and changes in its workflow. Hence,initial μApp deployment choices, like the placement ofmicroservices, may be sub-par later.© The Author(s). 2019 Open Access This article is distributed under the terms of the Creative Commons Attribution 4.0International License (http://creativecommons.org/licenses/by/4.0/), which permits unrestricted use, distribution, andreproduction in any medium, provided you give appropriate credit to the original author(s) and the source, provide a link to theCreative Commons license, and indicate if changes were made.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 2 of 30The management of μApps is performed by engineersaided by tools that provide timely data about applications(e.g., resources usage) and microservice lifecycle manage-ment (e.g., replicating microservices on demand). How-ever, these management tools are incapable of providingcrucial runtime data like the amount of data exchangedbetween two microservices or the resource usage historyof a given microservice. As a consequence, existing toolsare unable to perform management operations, like thereplacement of microservices, based on actual executiondata.At runtime, microservices that compose an applicationcan interact and exchange a significant amount of data,creating communication affinities [3]. We define affin-ity as a relation between two microservices given by thenumber and size of messages exchanged over time. Theseinter-service affinities can have a substantial impact on theperformance of the μApp, depending on the placementof the microservices, e.g., microservices with high affin-ity placed on different hosts will have worse performancedue to higher communication latency. Making this morecomplex is the fact that affinities change at runtime.In addition to affinity, developers must also account formicroservice’s resource usage history to optimize μAppplacement. For example, microservices with a history ofhigh resource usage should not be co-located on the samehost. Also, service upgrades and different workflows alongthe μApp execution change the resource consumptionand affinities.Existing management tools, like Kubernetes2 andDocker Swarm3, allow DevOps engineers to controlμApps by setting resources thresholds on the microser-vices. The management tools use this information todecide when to scale in/out each microservice and whereto place microservice replicas. At runtime, the man-agement tools continuously compare the instantaneousresource usage of the microservices with their resourcethreshold. When the resource usage reaches the limit,the management tool starts the scaling action. Duringscale out, existing management tools select the hostswhere to place the microservices replicas based on theset thresholds instead of their history of resource usage.As our experiments will show, in most cases a resourcethreshold is unrealistic and leads the μApp to waste clus-ter resources or to lose performance due to resourcecontention.Management tools should be aware of runtime andhistorical data for μApps to avoid misplacement ofmicroservices. Although these tools can use instanta-neous data to perform scale up/down activities, this isnot enough in cases where a re-arrangement of microser-vices is necessary. We therefore propose a new toolthat uses history and runtime data to better managemicroservices.The focus of our work is on improving the manage-ment of μApps through the use of runtime data as thebasis for automatic management tasks, such as placementoptimization.Next, we overview three challenges to realizing adapta-tion of μApps:– Challenge 1: Unified monitoring of μApps.Existing management tools can collect and exposemany resource metrics from executing μApps.However, each μApp uses its own monitoring stack.The diversity of monitoring options creates asemantic challenge, requiring a single unified datamodel.– Challenge 2: Finding a high-performingplacement.Microservices are usually placed usingstatic information like the available host resources.However, this strategy risks lowering μAppperformance by putting high-affinity microserviceson different hosts or by co-locating microserviceswith high resource usage. Hence, it is necessary tofind the best performing configuration that mapsmicroservices to servers. This need leads to twosub-problems: (1) a large space of configurations:with n servers and m microservices there aremnpossible configurations; and (2) the performance of aμApp configuration changes dynamically.– Challenge 3: Migrating microservices. Existingmicroservices management tools do not presentalternatives to performing live migration ofmicroservices between hosts. This migration isnecessary to provide seamless runtime adaptation.Our proposal is an adaptation mechanism, namedREMaP (RuntimE Microservices Placement), thataddresses the above three challenges and automaticallychanges the placement of microservices using theiraffinities and history of resource usage to optimize theμApp configuration. In our prior work [4], we consideredChallenge 1 by defining a model to support the evolutionof μApps. In this work, we refine the ideas presented in[4] to address Challenge 2 and Challenge 3. The core ofthis work is about addressing Challenge 2. We present ourview on runtime adaptation of μApps and the challengeswith optimally arranging microservices. Finally, in thiswork, we partially address Challenge 3.REMaP approach overview. Our solution uses aMAPE-K based [5] adaptation manager to alter theplacement of μApps at runtime autonomously. REMaPuses Models@run.time concepts and abstracts the diver-sity of monitoring stacks and management tools. Inthis way, our solution provides a unified view of thecluster and the μApps running under the adaptationmanager.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 3 of 30REMaP groups and places microservices with highaffinity on the same physical server. This strategy is incontrast with the existing static approaches that rely oninformation provided by engineers before μApp deploy-ment. For instance, Kubernetes arranges microservices ina cluster based on the resources limits (max and min)and tags set by engineers. Kubernetes does not considerinformation about the relationship betweenmicroservicesto improve the deployment of the μApp by reducing thehosts to be used and the communication latency betweenmicroservices. Hence, our adaptation manager can pro-vision resources based on actual microservice resourceutilization, avoiding resource contention/waste duringμApp execution. Moreover, the co-location of microser-vices decreases the impact of network latency on theμApp workflow, which improves overall application per-formance. At the end of the adaptation, the μApp hasan optimized configuration that reduces the number ofhosts needed to execute the μApp and improves its per-formance as compared to an unoptimized deployment.Prior work focusing on adaptation of μApps proposedto change the μApp deployment at runtime to provideruntime scaling [6] or to update a running deployment toa new version [7]. These approaches do not improve theplacement of the constituent microservices nor considerthe resource usage history when formulating an adapta-tion. These tools use instantaneous metrics gathered fromthe μApp, which do not reflect their real resources needsover a longer time period.We evaluated REMaP in two scenarios, and we com-pared the results of an optimization algorithm basedon SMT (Satisfiability Modulo Theory) [8] with a sim-ple variation of a First-Fit algorithm [9]. We madethis comparison to evaluate the feasibility of finding anoptimal placement instead of an approximation, given thecomplexity of the problem. In the first scenario, we usedthe proposed mechanism to compute the adaptation ofsynthetic application graphs, having a different number ofmicroservices and affinities. In this scenario, we realizedadaptations that saved approximately 80% of the hostsused initially by the μApp. This evaluation shows thatour approach produces better results on μApp with densetopologies. Moreover, when using SMT, the adaptationmechanism was unable to work on μApps larger than 20microservices. Hence, although our heuristic cannot guar-antee an optimal result, it can compute placements forμApps of any size.In the second scenario, we used REMaP to adapt a ref-erence μApp4 running on Azure. In this scenario, weachieved a performance improvement up to 62% andsaved up to 40% of hosts used in the initial deployment.Moreover, we found that a poor placement that uses thesame number of hosts can decrease the overall perfor-mance of theμApp by 150%, indicating that the placementrequires special care by engineers; care that our approachautomates.The rest of this paper is organized as follows. Section 2introduces the concepts necessary to understand the restof the paper. Section 3 discusses the challenges of general-purpose runtime adaptation of microservices. In Section 4we discuss the specific challenges to adapt μApps byre-configuring the microservices placement at runtime.Sections 5 and 6 present the design and implementationof our solution, respectively. Section 7 presents the evalu-ation of the proposed approach. We contrast with relatedwork in Section 8. Finally, Section 9 concludes and notessome avenues for future research.2 Background2.1 MicroservicesThe microservice pattern is an architectural style ofservice-oriented computing whose cornerstone is a highdegree of decoupling [10]. A microservice is an auto-nomic, and loosely-coupled software having a specificfunctionality in a bounded context. As shown in Fig. 1,microservices (hexagons) belonging to a microservice-based application (μApp) communicate using lightweightcommunication protocols like HTTP. These microser-vices are usually deployed in containers, a lightweightalternative to traditional virtual machines [1]. The use ofcontainers facilitates the elasticity of the μApp: only someparts, and not the entire application, need to expand andcontract in response to changing workload. For instance,suppose that the microservices related to orders have ahigher load than those associated with sign-ups duringa Christmas sale. In this case, just the first set of ele-ments needs to scale up to avoid bottlenecks, while theothers can contract and release resources for use by othercomponents. This behaviour is not available in monolithicapplications.Figure 1 shows the design of Sock-shop, a microservice-based reference application [11]. Sock-shop adopts goodpractices in μApps, like data storage and communicationmiddleware (e.g., RabbitMQ) wrapped by microservices,and containers, which provide flexibility to the μApp.Sock-shop is composed of a hub of six microservices(front-end, orders, users, carts, catalogue, and shipping),their respective data storage, and auxiliary microservices.The decoupling provided by microservices facilitatesthe maintainability of μApps by reducing the complex-ity of management tasks like upgrade and replication.The use of microservices typically increases the numberof components that make up an application and compli-cates applicationmanagement. Tomakematters worse, anessential feature of μApps is their ability to scale in/out byremoving/creating replicas as necessary. This fact causesmicroservice instances to have a short lifetime and addsfurther dynamism and complexity to the deployment.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 4 of 30Fig. 1 Architecture of Sock-Shop a reference μAppDespite the many similarities between services andmicroservices [2], there are some fundamental differ-ences. Developers use languages like WS-BPEL [12] todefine the workflow of a service-based application and usean engine to execute the workflow. By contrast, the flowof messages exchanged by microservices that composea μApp defines the workflow. Hence, it is necessary tochange at least one microservice to modify μApp’s work-flow, e.g., by replacing it. Consequently, more caution isneeded to evolve a μApp.μApp engineers use management tools, like Kuber-netes, to control a μApp automatically. Unlike autonomicapplications, whose management requires either mini-mal or no human intervention, microservice manage-ment tools need an engineer to guide the managementtasks. These tools can automatically update and upgradea μApp, e.g., scale in/out or roll out/back a microser-vice, by following the engineer’s instructions. In general,engineers set the maximum and the minimum number ofreplicas that aμApp should have, and a resource thresholdthat triggers the scaling process. Moreover, the manage-ment tool automatically deploys a microservice onto thecluster by considering attributes set by the engineers atdeployment time. However, this placement is not opti-mal and can jeopardize the execution of a μApp in somecircumstances.2.2 Autonomic computingAutonomic computing refers to self-managing computingsystems [13]. Self-management means that the system cancontrol itself, and human intervention is not necessary foractivities such as optimization, healing, protection, andconfiguration.A self-managed systemmustmonitor itself and the envi-ronment, analyze signals produced by the monitoring,and applies actions in response, perhaps by modifyingitself. These steps repeat indefinitely as a control loop.IBM systematized this loop by proposing a referencemodel for automatic control loops called MAPE-K [5](Fig. 2).In MAPE-K, the monitor collects data from themanaged system and dispatches them to the analyzerthat reasons over them or infers new information.Next, the analyzer forwards the result of the anal-ysis to the planner that computes an adaptation ormanagement plan. The executor receives the plan andapplies it to the managed system. Lastly, componentsof MAPE-K share a knowledge base that maintain rules,properties, models and other kinds of data used tosteer how to provide autonomy to the underneathsystem.Szvetits and Zdun [14] and Krupitzer et al. [15]surveyed several strategies for adapting complex, het-erogeneous, and dynamic systems that do not applythe adaption plan directly to the managed system.In this case, the adaptation plans are applied tomodels maintained at runtime (model@run.time) [16].model@run.time abstracts the system, simplifies the adap-tation process and helps to handle the diversity ofunderlying technologies. This model has a causal con-nection with the managed system such that changesto the application are reflected in the model, andvice versa [17]. The causal connection is carried outby a meta-object protocol (MOP) that maps the ele-ments of the model into their representations in theapplication.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 5 of 30Fig. 2MAPE-K reference model3 Challenges of runtime adaptation ofmicroservicesRuntime adaptation is inherent to μApps, which canevolve during execution. The decoupling promoted bythe microservice architectural style allows updates andupgrades at runtime without pausing or terminatingthe application. Scale in/out operations usually updateμApps, while roll out/back operations upgrade themicroservice versions.In our context, an adaptation consists of (1) replac-ing one microservice instance with another, usually ona different host, or (2) creating new microservice repli-cas. Management tools execute such adaptations. How-ever, engineers use these tools and manually guide theadaptation. For example, a tool can automatically triggerauto-scaling, but an engineer must fix both the maxi-mum number of replicas and the resource usage thattriggers the scaling. In an autonomic approach, the adap-tation mechanism would automatically decide on theseparameters.The high decoupling of μApps facilitates the adap-tation, although additional mechanisms are neces-sary to change a μApp safely. For example, while amicroservice is being replaced, the new instance canbecome unavailable for a short time. During this time,other microservices may attempt to establish com-munication and will fail as the new instance is notready.In addition to failures during adaptation, failures cancome up during normalμApp execution. Today’s develop-ers use design patterns like circuit breaker5 and retry withexponential back off [18] to minimize the negative impactof failures on a μApp.At runtime, another source of flaws is the statefulnature of microservices. When a new microservice mustreplace an old one, the management tool cannot auto-matically synchronize their data. In general, the criticalsteps to replace a microservice are (i) to instantiate thenew instance and (ii) remove the old one. Therefore,when a stateful microservice is updated, a mechanism isnecessary to deal with state synchronization.Finally, a μApp is potentially multi-lingual and multi-technology, which complicates monitoring. Althoughmonitoring tools can collect information from aμApp execution (e.g., instantaneous resource usage),behavioural aspects (e.g., resource usage history andμApp workflow) are not collected by existing tools.3.1 MonitoringμAppsIt is necessary to track the behaviour of a μApp to con-trol it. Having this information, engineers or managementtools can understand how the application works and thencompute plans to improve its behaviour. Furthermore, itis possible to foresee future behaviours and apply adapta-tions to optimize resources to accommodate them.The behaviour of a black-box μApp can be observed inat least the following three ways:Resource usage The resource usage is the amount ofresource used by a microservice during the μAppexecution, e.g., CPU, memory, disk and networkbandwidth.Application logs μApp engineers determine events ofthe application to signal errors, warnings, andinformational messages during its execution. Infor-mational messages do not log warns or errors,Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 6 of 30e.g., “[INFO] loading library xxx”. Dedicated toolsmaintain the events in the sequence they occur, andengineers use the application logs for tracking theμApp execution.Message information The messages exchanged bymicroservices, including message’s source and des-tination, payload size, some metrics like responsetime, and contextual data such as HTTP headersand response codes.However, instantaneous data is not enough to track thebehaviour of a μApp. Maintaining historical data alongthe execution is essential. Nowadays, engineers use third-party tools to record and track the historical data ofμApps, since management tools only expose instanta-neous microservice information. Some existing tools arenow being used for this purpose. cAdvisor6 gathers clus-ter (hosts) and microservices (wrapped into containers)metrics natively; Prometheus7 stores data collected bycAdvisor or self-stored by microservices; and Influxdb8stores monitored data.Although management tools expose the microservices’execution logs, these tools cannot aggregate and use themat runtime. Consequently, aggregators are needed to orga-nize logs, ensure their temporal order, and store themto maintain their history. Popular log aggregators includeFluentd9 and Logstash10. It is also necessary to use datastores like Elasticsearch11 and Influxdb to maintain a his-tory of the μApp execution. Furthermore, cloud providersusually provide their private solutions such as AmazonCloudWatch12.None of the current management tools are aware ofmessages exchanged between microservices. This fact is amajor drawback since messages are critical to understand-ing how a μApp actually works. There are few initiativesto gather and store μApps messages, like Zipkin13 andJaeger14.The broad diversity of tools to collect data and trackμApp behaviour is made worse by the fact that, in general,existing tools do not follow any standard. This lack createsa semantic gap in the information they provide. For exam-ple, data metrics collected by Influxdb and Prometheushave different formats. Hence, it is difficult to analyze thebehaviour of varying μApps running on the same cluster,since each one can use a different monitoring stack.Currently, the collected data is analyzed manually byengineers, who have to retrieve and parse the gath-ered data, send it to visualization tools, like Kibana15,to take some action based on what they observe. Thesesteps make the management of μApps complex anderror-prone [19].Also, a μApp may include microservices implementedin different languages, which means that various tools arenecessary to monitor the same information. Furthermore,not all languages include bindings for a specific tool, e.g.,Zipkin, which means that different tools may monitormicroservices belonging to the same μApp. The hetero-geneity of monitoring tools is a challenger as it is neces-sary to deal with different semantics, data structures, andtechnologies.3.2 Model at runtimeAccording to Blair et al. [16], the use of model@run.timesimplifies the inspection and adaptation of complex andheterogeneous systems. Hence, considering the hetero-geneity on monitoring μApps, model@run.time is aninteresting concept to be applied in the management ofthese applications.Models are used to simplify the representation of com-plex systems. The model is a high-level view that onlyexposes the relevant structure and behaviour of the systemaccording to the model’s usage intent.A model can also be used at runtime. In this case, themodel can provide a causal connection with the under-lying application/system. This causal connection allowschanges to be applied to the model and reflected in theapplication at runtime, and vice-versa. This feature facil-itates the adaptation process of μApps since it is notnecessary to deal with interfaces of the management tools.Hence, the model also acts as a proxy, abstracting andenhancing the access to the management tools’ interface.Due to these features, several projects, listed in [14], usemodels at runtime as the primary element of the runtimeadaptation of complex systems.Also, the unified view of the system in a single arti-fact facilitates the maintenance of its evolution [4]. μAppsare dynamic distributed systems, and their heterogeneitymakes challenging to track their evolution through time.The use of model@run.time helps by (i) unifying the datain a well-defined structure, and (ii) evolving it along withthe abstracted μApp. Hence, we can build up an evolutiontrace of the application by keeping snapshots of the modelas changes are applied.The history trace allows retrospective analysis toenhance the current state of theμApp or foresee its futurestate. These analyses are essential in bringing autonomy tomanage μApps since autonomic mechanisms can inspectcurrent and past states and decide what to do withouthuman intervention.Another advantage of using models at runtime is to planout elaborate actions that can be applied to μApps. Themodel organizes data in such a way that planners canreadily traverse the model, combining and deriving newinformation, without facing the semantic gap that appearswhen dealing with raw data produced bymonitoring tools.Finally, model@run.time allows safe changes to beapplied to μApps. Since the model has all the informationabout its underlying application, it is possible to check theSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 7 of 30changes applied to the model before consolidating them.For example, suppose that the adaption needs to movea microservice to a new host. In this case, it is neces-sary to check in the model if the target host has sufficientresources to accommodate the microservice (e.g., consid-ering its resource usage history). Without such a model,this check cannot be quickly performed.4 Optimal placement of microservicesIn Section 3, we emphasized that adaptation of μAppsmeans to change microservices to different versions byrolling them out/back, or by creating or deletingmicroser-vices instances through scaling in/out. In both cases, theadaptation relies on placing microservices into differenthosts. However, to define the best placement is not an easytask.The deployment of μApps in a cluster must take intoaccount the required resources defined by engineersand resources available in the hosts. To configure thedeployment, μApp engineers might set the minimum andmaximum amount of resources the microservice needs,e.g., CPU and memory. However, there are no rules todetermine these values accurately. Usually, engineers setthese values based either on previous executions of themicroservice or their own experience, which is subjec-tive. Hence, it is difficult to establish what resources amicroservice may need at runtime to work well.Although management tools, like Kubernetes, allowusers to set upper limits on resource usage, there is noguarantee that engineers will set these limits. And, evenif engineers do set them, there are no guarantees thatthe chosen values are the best for all workloads for anμApp execution. Besides, assuming that the restrictionsare properly configured, management tools do not imposethem during the execution of a microservice, but only usethese This issue is more evident in languages like Java(prior version 8)16 and Python17, in which the runtimecannot properly interpret these limits and can crash theμApp if the limits are reached. This unreliable approach,therefore, leads management tools to make poor deploy-ments, which may either degrade the application perfor-mance or crash the entire μApp.Another consequence of only setting the minimumquantity of resources is the placement of many microser-vices together into a single host. Co-located microser-vices may in aggregate demand more resources thanare available on the host. This demand leads theμApp into contention and hurts performance. Mean-while, microservices configured with minimum resourcerequirements drive management tools to deploy a μAppacross many hosts, whichmay waste resources. Also, plac-ing microservices across several hosts jeopardizes theirperformance due to the network latency imposed on theircommunication.It is worth observing that several μApps share a singlecluster and each one has different features and require-ments. But, management tools are unaware of the runtimeneeds of microservices. At deployment time, the clusterprovider tries to balance the hosts’ resource usage withoutjeopardizing the μApp performance. However, the lackof standardization by engineers to set the microservicesresource requirement complicates their placement.Existing management tools implement several com-mon placement strategies. These are used by the clus-ter provider to deal with the average demand ofμApps. Next, we overview these common placementstrategies:Spread strategy. The management tool places a mini-mum number of microservices per host in the clus-ter. This strategy tries to avoid resource contentionsince few concurrent microservices will dispute forthe same resources. However, it can lower μAppperformance by adding latency to request/responsemessages as microservices may be deployed ondifferent hosts. Moreover, this strategy can wasteresources since some microservices may need fewerresources than what their host provides. DockerSwarm and Kubernetes adopt the spread strategy.Bin-pack strategy. The management tool uses the min-imum number of hosts to deploy a μApp. Thisstrategy avoids the cluster resource waste. How-ever, putting many microservices together causescontention for the same resources, dropping μAppperformance drastically. This strategy is available inDocker Swarm.Labeled strategy. In addition to the resource require-ments, microservices can be annotated withattributes used to guide host selection. For exam-ple, a machine learning μApp can require beingdeployed on hosts with GPUs for performance rea-sons. Then, at deployment time, the managementtool selects a host that matches the microservicelabelled requirements. This strategy is usually usedto customize the default management tool strategy.For example, the default strategy of Docker Swarmand Kubernetes can be customized with labels asconstraints on the placement of some microservices.Random strategy. The management tool selects a hostto deploy a microservice randomly. This strategy isavailable in Docker Swarm.Whatever the strategy, management tools do notuse historical data to drive or enhance the place-ment of microservices. Existing tools select the hostsconsidering the instantaneous resource usage to placethe microservice, and rarely try to find an optimalsetting.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 8 of 304.1 The case for runtimemicroservices placementThe facility of scaling and upgrading microservices canthreaten the μApp, imposing resource contentions, net-work latency and wasting of cluster resources.The choreography of microservices defines the μAppworkflow, which means that it is necessary to upgrade oneormoremicroservices to evolve theμApp behaviour. Dur-ing an upgrade, the resource requirements might change,as well as the relationship between microservices mightresult in a new workflow.Similarly, a new version of a microservice can come upusing more or fewer resources than the old one. Manage-ment tools unaware of runtime resource usage or consid-ering only the minimum and maximum configuration canmake a poor placement choice for the new microservice.For example, if the new microservice has a higher com-munication demand than the prior version, the manage-ment tool unaware ofμApp communication requirementscan place microservices in different places. The high com-munication between the two services over the networkcan hurt the overall performance.Finally, the new workflow that arises after an upgradecan change the relationship between microservices. Forexample, microservices previously related may no longerbe created, and vice-versa. The new relationship amongthem requires aμApp reconfiguration (new placement) toavoid the performance degradation due to resource con-tention and network latency. The analysis of historicaldata can improve the placement of μApps by providingreliable information about different features of the appli-cation, such as the actual resource usage and the messagesexchanged.4.2 Steering microservices placementAnalyzing themessages exchanged bymicroservices helpsto understand their relationships. Related microservicesusually exchange a high number of messages and/or ahigh amount of data. The combination of the numberof messages and the amount of data gives us an ideaof affinity between microservices. High-affinity microser-vices placed in different hosts can impose performanceoverhead on the μApp due to network latency. Therefore,related microservices should be placed together.However, only putting high-affinity microservicestogether is not enough to optimize the μApp place-ment. It is necessary to consider the runtime resourcesusage of microservices to achieve optimal placement.Existing management tools do not take into accountthe historical resource usage to place microservices.Instead of considering static values set by engineersto select a better host, it is also necessary to ana-lyze the resource usage history to choose the hostthat better fits the actual microservice resourcerequirement.In Section 3, we discussed the use of Models@run.timeto keep runtime data and help the runtime analysis ofμApps. The history of resource usage allows the selectionof hosts based on the actual needs of μApps, avoiding (orat least reducing) the concurrency problems mentionedbefore.4.3 Placement optimizationOptimizing the placement of microservices in a cluster isa variation of the bin-packing problem [20]. In the bin-packing problem, objects of different sizes must be packedinto a finite number of bins of volume V in a way thatminimizes the number of bins needed. This approach isa combinatorial NP-Hard problem. In our context, theobjects to be packed are themicroservices and the bins arehosts of the cluster.Unlike the classical bin-packing problem, the place-ment of microservices in a cluster cannot consider onlyone dimension, but the microservices affinities and theirresources usage, e.g., CPU, memory, disk, and so on.Therefore, our problem is a multi-dimensional variationof bin-packing [21] that is exponentially harder to solve.The formal statement of the microservice placementproblem is stated as follows:Given a set of hosts H1,H2, · · · ,Hm and a set ofμApps P1,P2, · · · , where Pi is a set of n microservicesmPi,1,mPi,2, · · ·mPi,n linked by the affinity function A :mPi → mPi . Find an integer number of hosts H and a H-partition H1 ∪ · · · ∪ HB of the set {1, · · · , n} such that the⋃of the multi-attributes microservicesmPi,j fits onHk forall k = 1, · · · ,B, i = 1, · · · ,P, and j = 1, · · · , nPi . A solu-tion is optimal if it has minimal B and maximum affinityscore for all Hk .The multi-dimensional bin-packing problem adopted inthe cluster domain is well understood [22]. However, thecomplexity of computing an optimal result in a reasonabletime for big instances prevents its use at runtime.There are several approaches surveyed in [20, 22] tocompute this optimization in an offline way. At runtime,the best strategies are approximations calculated throughheuristics and evolutionary algorithms to achieve a quasi-optimal solution.4.4 Moving microservices at runtimeTo optimally place microservices in a cluster, it is first nec-essary to know how to move them at runtime. Not allmicroservices can be moved into a new placement, e.g.,stateful and labelled microservices.Further, a stateful microservice is a kind of data sourceused by μApps. Usually, μApps outsource their data todedicated storage services provided by cluster infras-tructure, which are out of the scope of managementtools. If the μApp has a data store (e.g., SGBDs andNoSQL databases) and it is moved to a new placement,Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 9 of 30management tools are unable to seamlessly migrate theirdata to the new destination, which leads to inconsistenciesin the state of the μApp.Existing management tools have simple primitives usedto move a microservice across different hosts. However,due to a limitation of existing operating systems andframeworks, it is not possible to live-migrate processes(microservices) between machines. As a workaround, themovement of a microservice can be emulated by a three-step sequence:1. Instantiate the microservice replica at the newlocation,2. Wait for the microservice to become ready, i.e., loadits libraries and be able to handle requests, and3. Remove the microservice replica from the previouslocation.Management tools usually have built-in primitives tohelp to implement these steps. The primitives try to avoidfaults during the migration. To achieve a safe migration,μApps should be implemented using patterns such ascircuit breaker and retry with exponential back-off (seeSection 3).5 DesignTo bring autonomy to μApp management, we propose aMAPE-K [5] based adaptation manager, named REMaP(RuntimE Microservices Placement), to autonomouslyadapt μApps at runtime. Runtime adaptation requiresthree main steps: to monitor the system under manage-ment, to make a decision based on monitored data, andto execute an adaptation plan taking into account thedecision. Figure 3 overviews our solution.5.1 Design overviewUpgrade events of the μApp trigger the adaptation pro-cess. The adaptation repeats indefinitely at regular timeintervals. When the code of one or more microserviceschanges, i.e., developers push new code into the reposi-tory, the Adaptation Manager listens for this event andstarts the adaptation. The push command should belabelled with the time interval in which REMaP waitsbetween the adaptations.The first step of the adaptation is to collect data aboutthe μApp. The Monitor inspects the μApp through theMonitoring Adapters. The adapters abstract away differentmonitoring technologies to gather useful historical data,such as resources usage and microservices interactions(μApp workflow). The Monitor gathers data according tothe time interval set in the adaptation bootstrap (e.g., ifthe time interval is 10 minutes, the Monitor gathers alldata generated in the last 10 min.) REMaP takes collecteddata and populates the application Model. The Modelorganizes the data for the μApp, building up its topol-ogy, filling up each representation of the microservices inthe model with their historical data, such as the averageof CPU and Memory consumption in the time interval,and linking the microservices according to the messagesexchanged.Fig. 3 Overview of the proposed solutionSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 10 of 30Next step is the model analysis. The Analyzer inspectsthe model looking for interactions between microservicesto compute their affinities. The Analyzer stores the affini-ties in the model, in such way that the Planner can accessthem.Once the affinities are available, the Planner can com-pute the adaptation plan. The Planner uses the affinitiesand resource usage stored in the model to calculate a newplacement plan (adaptation plan) for the microservices.In this scenario, the adaptation means the optimizationof the microservice placement. The optimization relieson two dimensions: microservices’ affinities and resourceusage history. Considering these dimensions, the Plannercomputes a deployment plan to reduce the resource usageand communication latency while minimizing the impacton the application performance.Traditional approaches to the Bin-Packing problem tryto minimize the number of bins used considering thenumber of items available and their respective values (seeSection 4). In contrast, the optimization of microserviceplacement also includes the concept of affinity, so that thevalue of an item (microservice) varies according to theother items in the bin where it is assigned. This featureincreases the complexity of the problem. Hence, in addi-tion to the minimization of resource usage, we also aim tomaximize the affinity score of the selected hosts, i.e., plac-ing the maximum number of highly-related microservicestogether.Finally, the Adaptation Manager applies the adap-tation on the Model and checks the consistency ofchanges before consolidating them in the running μApp.The Adaptation Manager forwards to the Executor thechanges that do not violate the model.The Executor consolidates the changes in the μApp bytranslating the actions defined in the adaptation plan andapplied to the model into invocations to the managementtool API.The rest of this section details all of the componentsintroduced above.5.2 ModelTheModel shown in Fig. 4 abstracts and allows the inspec-tion and analysis of μApps at runtime. As mentioned inSection 3.2, we use Models@run.time concepts to makeviable the use of a unique artifact and reduce the semanticgap between technologies used to monitor μApps.TheModel abstracts essential elements of the μApps ina cluster. This model is inspired by the evolution modelproposed in [4] and includes the concept of affinity. In thiswork, the model acts like a facade to simplify and unifythe interfaces provided by different monitoring tools.Class Microservice models a microservice and includesthe name and an indication whether the microser-vice is stateful or not. Class MicroserviceInstanceis a specialization of class Microservice and repre-sents a microservice instance, i.e., a μApp includesdifferent kinds of microservices and each type ofmicroservice can have multiple replicas (microserviceinstance). A microservice instance has the total num-ber of messages and data exchanged by a microservicereplica.Class Message models the communication betweenμApps, and represents the edges in theμApp graph. Everymessage has a unique id, response time, timestamp, andsize. The set of messages describes the workflow of theμApp.Class Affinity models the communication between twodifferent microservices (not their replicas) considering thenumber of messages and amount of data exchanged. Theaffinity has a degree that represents the strength of therelationship between two microservices.Class Cluster abstracts the management tool used andmaintains the hosts available in the cluster. In turn, eachclass Host has a set of microservice instances.Finally, hosts and microservice instances have Resourcesattributes that maintain the information of the usage his-tory, e.g., CPU andmemorymean usages (history) of hostsand microservices, and resources limits. Figure 5 showshow a μApp is represented at runtime by our model, andit highlights the μApp architecture (application view) andthe μApp deployment (cluster view).The cluster view models how the μApp is deployedacross several hosts and the use of resources by hosts andmicroservices. Moreover, this view shows the communi-cation topology and messages exchanged by the microser-vices. The cluster view is volatile as microservices replicasfrequently come up and go at runtime.The application view models the architecture of μAppsrunning in a cluster and highlights the microservices thatmake up the application. This view also shows affinitylinks between microservices; this view is more stable thanthe cluster view since microservice upgrades are less oftenthan microservices scaling.The separation of application and cluster concerns cre-ates a more expressive model. It allows the analysis andadaptation actions to be performed individually on theμApp or cluster without needing to inspect the wholemodel. For example, the Adaptation Manager can use afresh configuration to compute the adaptation plan (clus-ter view), while the Executor uses cluster information toguarantee that only safe changes will be applied on theμApp (application view).5.3 MonitoringThe Monitoring component, shown in Fig. 3, is designedto gather heterogeneous data from the cluster and unifyit in a technology-agnostic API to populate the Model.The cluster data is collected discretely to avoid floodingSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 11 of 30Fig. 4 μApp modelthe Adaptation Manager and consequently triggering toomany adaptations.Component Monitoring provides a standard way toretrieve data independent of monitoring technologiesused in the cluster. This component is passive (onlyreturns data in response to a request) and aggregates alldata necessary to compute the adaptation plan. In prac-tice, the Model Manager used information monitored toupdate the runtime model.Every μApp has a monitoring stack to collect data. Usu-ally, the monitoring stack collects three different kindsof data: resources usage, execution logs, and exchangedmessages. The monitor maintains a global view of theenvironment by gathering information from the manage-ment tool being used (e.g., Kubernetes or Docker Swarm),host and microservice resource usages, and events gener-ated by DevOps operations, such as updates to the coderepository and microservices deployment. The numericdata, usually related to resources usage, are aggregated asthe average of instantaneous values measured from theμApps components. For instance, this average can repre-sent the history of CPU usage of a microservice in a giventime interval.Monitoring tools collect data and store them in differ-ent data stores continuously. The monitor abstracts thesedata stores by using clients responsible for retrieving andtransforming these data into agnostic structures used forpopulating the model.Finally, the monitoring provides data according to var-ious aspects such as resources metrics, messages, logs,and events. For each of these, the monitoring componentallows sampling of the data over a given period.5.4 AnalyzerThe Analyzer component, shown in Fig. 3, is designedto process the model at runtime by looking for affini-ties between microservices. We define affinity betweentwo microservices using the number of messages and theamount of data exchanged between them. We use a ratio(weight) in the affinity calculation to steer the Analyzerexecution. The data exchanged by the microservices arenot equally distributed among all exchanged messages. Itmay exist μApp workflows with few messages and a largeamount of data and vice-versa. Hence, a high ratio value(ratio > 0.5) leads the Analyzer to value the number ofmessages over the amount of data. A small value (ratio< 0.5) does the opposite, and a ratio of 0.5 balance the twoattributes equally.TheAnalyzer component detects unexpected behavioursnot perceived by application engineers. Different analyz-ers can be implemented and plugged into the adaptationmechanism, depending on the analysis needed. In thiswork, we design an Affinity analyzer that detects affinitiesbetween microservices. As mentioned in Section 4, theaffinity is used to optimize the μApp placement.The analyzer checks the messages exchanged by theμApp (stored in the model) and calculates the affin-ity between two microservices. This calculation usesthe number and size of messages to determine the bi-directional affinity. We define the affinity between twoSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 12 of 30Fig. 5 Instantiation of the modeltypes of microservices a and b as Aa,b and calculate it asfollows:Aa,b = ma,bm × w +da,bd × (1 − w), (1)where,– m is the total of messages exchanged by allmicroservices,– ma,b is the number of messages exchanged betweenmicroservices a and b,– d is the total amount of data exchanged by allmicroservices,– da,b is the amount of data exchanged betweenmicroservices a and b,– w is the weight, such that {w ∈ R | 0 ≤ w ≤ 1}, usedto define which variable is the most important tocompute the affinity, i.e., number of messages oramount of data exchanged.The analyzer calculates the affinities between allmicroservice instances and dispatches them to the plan-ner via the model manager. Besides, the analyzer aggre-gates affinities of microservices instances, taking intoaccount their types and populates the model with thecomputed affinities.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 13 of 30Finally, in addition to synchronous communicationthrough REST APIs, the microservice architecture com-monly uses asynchronous communication through Pub-Sub protocols. REMaP can compute an optimization forμApps using async communication since, like data stores,the messaging middleware (e.g., RabbitMQ) is wrappedinto a container. In this case, the analyzer can identifywhich microservices have a high communication rate andmay co-locate them with the middleware. However, ifthe μApp outsources the messaging middleware, REMaPcannot correctly calculate microservices affinities, andconsequently, no placement optimization may be applied.5.5 PlannerThe Planner component decides how to apply the adapta-tion to the μApp. Similarly to the analyzer, different plan-ners can be implemented and plugged into the adaptationmechanism, depending on the adaptation strategy.We propose two Planners to compute the placement ofmicroservices during an adaptation: the Heuristic-basedAffinity Planner (HBA) and the Optimal Affinity Planner(OA). Both planners compute a new placement for μAppsby reducing this problem to a multi-objective bin-packingproblem. As this problem is NP-Hard, we know that forlarge μApps an optimal approach is infeasible. Hence,we implement the heuristic version (HBA) to achieveapproximate solutions for large μApps and the optimalversion (OA) to achieve an optimal solution for smallμApps.Both planners access the model to obtain informationabout the resource usage history and affinities betweenmicroservices to compute the adaptation plan. It is worthnoting that the planners do not use instantaneous valuesof themetrics. Instead, they use historical datamaintainedin the model. This approach provides more reliable limits(max and min) on the resource needs of each microser-vice.Finally, both planners can handle stateful microservicesand data stores, since the data stores are also wrapped intomicroservices. However, REMaP cannot handle data syncacross different hosts after migrating a stateful microser-vice. Hence, the migration of stateful microservices maylead the μApp into an inconsistent state.5.5.1 Heuristic-based Affinity Planner (HBA)The heuristic planner (HBA) reorganizes the placementof microservices that make up a μApp in a cluster. Theplanner computes how to rearrange the microservicesso that microservices with high affinity are co-located,while microservices’ resource usage and availability ofresources at the host are taken into account. This plan-ner is inspired by the First-Fit [9] approximation algorithm(see Algorithm 1) to compute the list of movements nec-essary to reconfigure the μApp.Algorithm 1 iterates over the affinities and tries to co-locate the microservices associated with them. For eachpair of microservices(mi,mj)linked by an affinity, thealgorithm attempts to placemj onto the host ofmi (Hi). IfHi does not have enough resources, the algorithm tries toput mi onto the host of mj(Hj). If both hosts do not haveenough resources to co-locate mi and mj, these microser-vices remain at their original hosts. When a microserviceis placed into a new host, it is marked as moved and can-not move anymore, even if it has an affinity with othermicroservices. In the end, a list of movements is gen-erated containing microservice identities and their newlocations.This algorithm does not guarantee that the list of movescomputed is optimal for a cluster given a set of microser-vices.Algorithm 1:Variant of the First-Fit algorithm tomovemicroservices.1 moved ←[ ]2 // affinities are in decreasing order3 forall the a ∈ affinities do4 // r(m) gets the microservice usage resources5 // r(H) get the amount of free resources in host H6 // Microservices mi,mj have affinity a7 mi ∈ Hi // mi located at host Hi8 mj ∈ Hj // mj located at host Hj9 Hi = Hj10 hasMoved ← false11 if r (mi) + r(mj) ≤ r (Hi) ∧ mj /∈ moved then12 Hj ← Hj − mj13 Hi ← Hi ∪ mj14 hasMoved ← true15 end16 else if r(mi) + r(mj) ≤ r (Hj) ∧mi /∈ moved then17 Hi ← Hi − mi18 Hj ← Hj ∪ mi19 hasMoved ← true20 end21 if hasMoved then22 moved ← moved ∪ [mi,mj]23 end24 end5.5.2 Optimal Affinity Planner (OA)Planner OA optimizes the placement of μApps. Given alist of affinities between microservices, this planner com-putes an optimal configuration of the microservices ina cluster. The optimization is calculated by using a SATsolver [23]. We state our placement optimization problemas follows:Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 14 of 30Maximize:(ji,jk ,score)∈A,n∈Hosts∑if(p(ji, n) ∧ p (jk , n), score, 0)(2)Subject to:[Hosts∑np(j, n)]= 1 for j ∈ Microservices (3)⎡⎣Microservices∑jif(p(j, n),M(j), 0)⎤⎦≤M(n) for n ∈ Hosts(4)⎡⎣Microservices∑jif(p(j, n),C(j), 0)⎤⎦≤C(n) for n ∈ Hosts(5)Where:– Microservices is the set of microservices to bedeployed,– p(j, i) is true if microservice j is placed on host i,– A ⊂ Microservices × Microservices × N associates anaffinity score to a pair of microservices,– Hosts is the set of hosts available for placingmicroservices,– M(j) is the memory required by microservice j,– M(n) is the memory available in host n,– C(j) is the number of cores required by microservicej, and– C(n) is the number of cores available in host n.Equation 2 defines the objective function, maximizingthe sum of affinity scores of all co-located microservicesji, jk . This equation returns score if p(ji, n) ∧ p (jk , n)evaluates to true and 0, otherwise.Equation 3 is a constraint enforcing that each microser-vice is placed on precisely one host. For eachmicroservice,the sum p(j, n) over all hosts must be 1, meaning that foreachmicroservice j, pmust be true exactly once. Note thatwhile amicroservice can only be placed on one host, a hostmay have multiple microservices placed on it. Equations 4and 5 enforce that each host has sufficient memory andcores for executing the microservices.This planner tries to minimize the number of hosts usedto deploy aμApp andmaximize the affinity scores on eachhost. In practice, this algorithm places microservices withhigh affinity together, considering the host resources andthe microservice resource usage history.Unlike the HBA planner, the OA planner is guaran-teed to find an optimal placement, i.e., oen that minimizeswasted resources.5.6 ExecutorComponent Executor, shown in Fig. 3, is designed toapply the adaptation plan computed by the Planner in theμApps safely. As μApps are constantly changing, an adap-tation that was computed but has not been yet appliedcould be unsafe to apply due to external factors. As theModel is causally connected, if the application is upgradedand has part of its architecture changed, themodel reflectsits new configuration. Hence, the Executor validates thechange on the Model before applying the change to theμApp. If the change is no longer valid, then it is discarded.The Executor component essentially translates high-level commands defined by the planner as low-level prim-itives of the management tool. Hence, an executor isnecessary for each management tool.The executor first checks whether it is possible to movea microservice from one host to another in the modelor not. In some situations, the executor cannot performthis movement. For example, assume that microservices Aand B have two instances, A.1 and A.2, and B.1 and B.2,respectively. Besides, A.1 and A.2 have high affinity withB.1 and B.2 as well. As mentioned in Section 5.4, the ana-lyzer checks in the model that the microservice of type Ahas high affinity with B. Also, suppose that the planner hascomputed that A.2 should be co-located with B.2, but atruntime, A.2 has been de-allocated due to an unexpectedscale-in action. Therefore, the movement to co-locate A.2with B.2 becomes invalid.By only using valid movements guarantees that only safechanges occur in the μApp. If the movement is valid, theexecutor attaches the microservice to the destination hostand unsets this microservice from the source host.Finally, the executor deals with microservice instancesthat come up during the adaptation process. Once themodel has the microservices linked by the affinities, theexecutor can use this information to drive where the newreplicas will be placed. For example, given two microser-vices A and B with high affinity. Initially, there might beonly replicas A.1 and B.1. However, during adaptation toco-locate A.1 and B.1, the microservice B scale out, anda B.2 replica is generated. The Executor will check themodel and find the affinity between A and B. First theExecutor will attempt to co-locate B.2 with A.1, but itrechecks the model, and the host where A.1 is placed doesnot fit another replica of B. So, the executor will try toco-locate B.2 with another microservice such that both ofthem have an affinity. If such microservice does not exist,the executor maintains replica B.2 at the host where it wasinstantiated.5.7 Model managerThe Model Manager is the core component of REMaP. Itimplements the causal connection between the model andinstances of the microservices that compose the μApp.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 15 of 30In essence, the model manager triggers the adaptation bycoordinating the MAPE-K elements, and by maintainingthe model at runtime.TheModel Manager has two key elements:Model Han-dler and Adaptation Engine (engine). The model handlerpopulates the model using data collected by the moni-tor. At runtime, the model is represented as a graph (seeFig. 5), and the model handler performs changes on thisgraph, e.g., the inclusion of affinities, and microservicesmoves.The adaptation engine coordinates the actions of theMAPE-K components and provides an interface to addnew analyzers and planners. Moreover, this engine trig-gers the adaptations. In this paper, the adaptation per-formed is the placement optimization applied to themicroservices. The adaptation is triggered in timed inter-vals set by the μApp engineer, and each μApp has itstimer. However, when the μApp is upgraded (e.g., newversions of its microservices are deployed), the timer isreset to wait for this new version generates enough datato populate the model. When the time interval is reached,the control loop is started. The analyzer calculates theaffinities, updates the model, and notifies the planner. Theplanner uses the affinities to compute an adaptation plan.The planner sends the adaptation plan to the executor thatmigrates the microservices.The causal connection has two steps. In the first step,known as reflection, REMaP receives data collected by themonitor and uses it to create the model. In the secondstep, the reification, REMaP consolidates the changes tothe model into the executing μApp through the executor.6 Implementation6.1 MonitoringWe implemented the Monitoring component (see Fig. 3)to collect data from Influxdb18 and Zipkin19.Influxdb stores resource information from themicroser-vices and hosts. Heapster, a Kubernetes plug-in20, collectsresource usage information of microservices and hosts.It inspects microservice containers and hosts, and storesCPU and memory metrics into Influxdb.Zipkin is a distributed tracing system to collect mes-sages exchanged between microservices. Developers haveto instrument the microservice with code snippetsinforming which messages Zipkin needs to capture. Oncecollected, Zipkin stores and makes them available via anAPI.We also implemented a Kubernetes client to collectsignals from the cluster and cluster configuration. Kuber-netes has an API that provides cluster data such as avail-able hosts and running microservice instances. This datais used to populate the model as illustrated in Fig. 5.Each monitoring component wraps the underlyingmonitoring technology and exposes some interfaces:MetricsInspectionInterface provides information aboutresources usage, MessagesInspectionInterface givesinformation about exchanged messages, and ClusterIn-spectionInterface stores information about cluster dataand organization, e.g., hosts and running microser-vice instances. These interfaces are combined into aInspectionInterface exposed by the monitoring.Finally, the monitor also implements a listener to handleDevOps events. The listener receives events from Travis.Travis21 is a continuous integration tool that signals whena new deployment event occurs, such as upgrading aμApp. Hence, when engineers upgrade the μApp, thislistener resets the timer in the adaptation engine, asdescribed in Section AnalyzerAs presented in Section 5.4, the affinity analyzer retrievesinformation about messages exchanged by the microser-vices from the runtime model and calculates their affini-ties using Eq. 1. Our analyzer uses the EMF frameworkto look up the elements in the model. The EMF frame-work22 has inner mechanisms to transverse the modeltransparently. Hence, the analyzer only looks up elementsby their types, in this case, lookup for message types.After calculating the affinities, the analyzer generatestwo lists of affinities. One is a sorted list that the analyzerdispatches to the planner. Another list is aggregated, bysumming affinities of the same type of replicas into oneaffinity.6.3 PlannerThe planner computes the movements to optimally re-arrange the microservices. It creates a list of moves totransfer a microservice from one host to another andpasses this list to the model manager. Then, the modelmanager forwards the list to the executor.As mentioned in Section 5.5, we implemented two plan-ners: HBA and OA.6.3.1 HBA PlannerThis planner goes through each affinity generated by theanalyzer and checks if it is possible to move one of themicroservices, as defined in Algorithm 1. If the movementis valid, then it is stored in the Adaptation Script. It isworth observing that only stateless microservices can bemoved. As mentioned in Sections 3 and 4, the movementof stateful microservices can raise issues on μApps execu-tion. Hence, we decided to add this constraint to plannerHBA.To better illustrate this point, given microservices A.1and B.1 running on hosts H.a and H.b respectively, theplanner checks if A.1 and B.1 fit onto H.a. If possible,a movement is computed to move B.1 to H.a. Other-wise, the planner checks if both microservices fit on H.b.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 16 of 30In this case, a movement is computed to move A.1 toH.b. If both microservices neither fit on H.a nor H.b,then this affinity is discarded, and the planner tries thenext affinity. The HBA planner only moves microservicesto hosts where they already execute. In this example,microservices A.1 and B.1 can only be moved to hostsH.a or H.b.After passing over all affinities, the planner forwards anAdaptation Script to the executor.6.4 OA PlannerPlanner OA computes the placement of microservicesusing an SMT solver to calculate the optimal arrangementof microservices in such a way that minimizes the numberof used hosts and maximizes the affinity scores for eachhost.Our implementation uses the Z3 SMT solver23. Theoptimization is modelled as a satisfiability statement [23]that can return the optimal placement to a given input.However, SMT solvers usually use brute force to computean optimization. Hence, as the placement of microser-vices is an NP-Hard problem, SMT solvers are unable tocalculate an optimal placement for large instances of thisproblem.Planner OA transforms the SMT solver output intoa list of moves like move(microservice, source=host, tar-get=host). Next, it sends the list to the model manager thatforwards it to the executor.Unlike HBA planner, OA planner can move A.1 andB.1 to hosts other than H.a and H.b. Furthermore, thecurrent implementation of planner OA cannot differen-tiate stateless and stateful microservices. As OA plannermust create a satisfiability formula for all attributes usedto compute an adaptation plan (microservices affinitiesand metrics of CPU and memory), adding a dimensionincreases the difficulty of calculating an optimal adapta-tion plan exponentially, even for small μApps, e.g., lessthan 12 microservices. Hence, we choose not to use thisconstraint in the computation of the adaptation plan.6.5 ExecutorThe executor has an engine that identifies the kind ofadaptation plan received from the planner and executes itautomatically.Similarly to the monitor, the executor also provideswrappers to existing management tools. When the execu-tor receives the adaptation plan, it applies the movesone-by-one on the model. If a move cannot be applied,as discussed in Section 5.6, it is discarded. Otherwise, themove is sent to the management tool wrapper that appliesit to the μApp. Currently, the implementation includeswrappers for Kubernetes and Docker Swarm.In Kubernetes, the wrapper applies the changes byupdating how the microservices are attached to the hostsin the deployment description maintained at runtime byKubernetes. Kubernetes goes through all services updat-ing their placement attribute. Next, it executes the update,e.g., it creates a replica of the updated microservice ina new host, starts the microservice and automaticallyremoves the old one.Docker Swarm wrapper works similarly. However,unlike Kubernetes, Docker Swarm first removes the pre-vious microservice and then creates a new replica in thenew location.It is worth observing that, in both wrappers, if theexecutor detects a failure after applying the changes, theadaptation process stops, and the change is undone inboth the μApp and model.6.6 Model managerREMaP (see Fig. 3) wraps the Model Handler and Adapta-tion Enginemaintains theModel at runtime, and connectsall MAPE-K related components.REMaP coordinates the MAPE-K components throughits built-in messagingmechanism. TheMonitor sends col-lected data to the Model Manager that dispatches them tothe messaging mechanism. The Model Handler is respon-sible for building up the Model. When the Model Handlerbuilds the model, it signals the Analyzer that must evalu-ate it. Next, the Analyzer signals the Planner to computethe adaptation plan, i.e., it generates the adaptation script.Finally, the adaptation script is delivered to the Executorthat carries out the adaptation. All signals are received anddispatched via the messaging mechanism.The Model Handler also uses the EMF frameworkto maintain the model at runtime. EMF abstracts theconstruction/traversal of the model and provides arobust notification mechanism to notify when the modelchanges, signalling these changes to other components.In our implementation, theModel Handler captures thesesignals to update the number of messages and total dataexchanged between the microservices.When a message is attached to a microservice instance,EMF signals to the Model Handler that the model wasupdated. The signal includes the message attributes. TheEMF notification uses actuators to update the microser-vice instance automatically by counting the new messageattached to it and the message size. Once the microserviceinstance is updated, EMF signals to the Model Handlerthat the microservice was updated. Recursively, the EMFnotification mechanism updates the application, count-ing the total number of messages exchanged by the wholeμApp and the total amount of data exchanged.REMaP uses the Adaptation Engine to handle a timedevent to retrieve all messages from themodel, as describedin Section 5.7. After an adaptation, the Model Managerneeds to wait for a while before building the model. Thistime is necessary because the model is constructed usingSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 17 of 30execution data collected from the μApp, e.g., resourceusage. In the current implementation, DevOps engineersare responsible for setting up this time delay. This infor-mation is part of the event signalled during the μAppdeployment. The continuous delivery tool, Travis, handlesthe deployment of the microservices and notifies theMonitor via a Web hook when the building processfinishes.7 EvaluationWeusedmock and empirical evaluations to assess the per-formance of REMaP. The mock evaluation focused on thetime to analyze and adapt different μApp architecturesgenerated artificially during the experiments. In practice,this approach served to show the limits of REMaP, e.g.,the size of μApp, such as the number of microservicereplicas and hosts, that the Analyzer can examine, andhow many hosts the Planner can save through optimiz-ing the placement of microservices. On the other hand,the empirical approach shows the resource consump-tion of REMaP during its execution and its impact onan existing μApp, named Sock Shop24. In both cases,REMaP was executed on a dedicated machine equippedwith an Intel(R) Core(TM) i7-6500U CPU @ 2.50GHzwith 16 GB of RAM and running Ubuntu 16.04 LTS.7.1 Mock evaluationThe objective of this evaluation is to understand theimpact of REMaP on μApps in an entirely controlledscenario. To assess this impact, we considered two per-formance metrics, namely number of saved hosts andtime to compute the adaptation plan. The metric num-ber of saved hosts shows us how many hosts we cansave in a μApp deployment after carrying out the adap-tation plan computed by the Adaptation Manager (seeFig. 3). The metric time to compute an adaptation planmeasures how long the AdaptationManager takes to com-pute the adaptation. The measurement of this metricincludes three phases: monitoring, analysis, and planning.In the end, the sum of the time to compute each ofthese phases gives us the time to calculate the adaptationplan.Before presenting the experiments, we first defined theμApps to be used. We generated two artificial topolo-gies, as shown in Fig. 6, using Barabási-Albert scale-freenetwork model [24]. Both topologies emulate configura-tions widely adopted in μApps: API-gateway and Point-to-Point.Barabási-Albert is a well-known model to generate ran-dom network graphs. A graph of n nodes grows by attach-ing new nodes with m edges to existing nodes with highdegree (preferential attachment).Similarly to the Barabási-Albert model, the microser-vice architecture is used to design reliable applications byinterconnecting hubs of microservices. A hub means sev-eral replicas of a given microservice and its use makesthe application more reliable in such a way that failure ofone replica does not compromise the entire application.A μApp usually spreads out as a consequence of splittinga microservice (old vertex) into several other microser-vices (new vertices). This feature motivates our use of theBarabási-Albert model to represent μApps.For consistency and reproducibility, we used the Net-workX25 library to generate complex networks. algorithmencapsulates the Barabási-Albert model function to guar-antees that all graphs generated are connected like actualμApps.We set m = n − 1 and m = 2 to generate the API-gateways (Fig. 6a) and Point-to-point (Fig. 6b) topologies,respectively. These values guarantee that the generatedgraphs have similar structures even when varying thenodes (microservices) and edges (affinities).We used the resource usage of microservices with a uni-form distribution: CPU over the interval 1–500 millicoresand memory in the range 10–500 MB. Hosts have 4000millicores and 8GB of memory.In the experiments, we used three different planners tocompute the adaption plan (see Section 5.5):HBA,OA anda modified version of OA. This modified version calcu-lates a placement only considering the resources availablein the hosts, which means that it neither tries to maximizethe affinities score in a host nor minimizes the number ofhosts to be used.We conducted the experiments in three steps. Firstly,we measured themonitoring time of each topology. In thisstep, we gathered data stored in the monitoring stack ofthe mock μApp to draw up the model.Next, we simulated several scenarios for 10 min-utes varying the number of messages exchanged by themicroservices(101 to 105)and the number of microser-vices available(101 to 103)to see how these parame-ters affect the computation of affinities. Initially, eachmicroservice is running on a dedicated host, i.e., we usedthe spread strategy (see Section 4). In this second step,we measured the time to compute the affinities, namelyanalysis time.Finally, in the last step, we measured the planning time.We measured the time to compute the adaptation plansbased on the affinities calculated in the previous step.Moreover, we calculated how many hosts we can save byapplying the generated adaptation plans.The number of movements computed by a planner isnot proportional to the number of microservices replicasand hosts in the model. Hence, we decided to create arti-ficial movements to evaluate the Executor. In this case, wemeasured the time tomove 101 to 103 microservices usingKubernetes. We choose Kubernetes because it is a widelyused management tool.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 18 of 30a bFig. 6 Topologies used in the experiments. a API Gateway, b Point-to-PointTable 1 shows a summary of parameters and their valuesused in our experiments.Figure 7 shows the number of hosts saved by the adapta-tion process considering various topologies and configu-rations, i.e., a different number of microservice instances,hosts, and exchanged messages. Before the adaptation, allmicroservices were deployed using the spread strategy:one microservices per host.In the experiments, planner OA only computes optimalplacements for μApps having fewer than 20 microser-vices. In these cases, plannerOA can save up to 85–90% ofthe hosts compared to the original deployment. Similarly,PlannerOAmodified only works withμApps having fewerthan 20 microservices. However, the savings are worse,i.e., around 20% of hosts and in a few situations a saving of40–45%.Only planner HBA can compute placements for μAppslarger than 20 microservices. In that case, planner HBAcan save up to 85% of hosts. However, for μApps withmore than 30 microservices, planner HBA cannot savemore than 30% of hosts.Figure 7 shows that the topology affects the computa-tion of the placement optimization. As shown in Fig. 7aand b, the results of planners HBA and OA are different.The difference happens because plannerHBA implementsa heuristic. As the API-gateway topology is similar to astar, and edge microservices only have the affinity withone core microservice, the algorithm tries to place all edgenodes together with the core, and when the core host is atTable 1 Parameters of the mock experimentParameter (Factor) Values (Levels)Planner HBA, OA, and OA ModifiedTopology API Gateway Point-to-PointNumber of exchanged messages 101, 102, 103, 104, 105Number of microservices 101, 102, 103Number of Microservices Movements 101, 102, 103capacity, other microservices are not moved. The heuris-tic behaviour drastically limits the number of hosts thatcan be saved in dense μApps (Point-to-Point topology). Ina Point-to-Point topology, each microservice could haveaffinities with several others. Thus, the heuristic insteadof trying to group most of the microservices with a singlecore microservice, like in API-gateway topology, it cre-ates several groups os microservices (hubs) in which thecore microservice is that one with high affinity degree (i.e.,more affinities with other microservices). Then, heuristicspreads themicroservices over the cluster according to thelocation of microservices with a higher degree, limitingthe number of hosts saved.Planner HBA saves fewer hosts in a scenario with feweraffinities between microservices (API-Gateway topology)than in dense topologies (Point-to-Point topology). Incontrast, planner OA saves up to 85% of hosts when opti-mizing Point-to-Point topologies, and up to 90% of hostswhen optimizing API-Gateway topologies, as illustratedin Fig. 7c. However, in this case, we can observe that plan-ner OA cannot compute an optimization for all instancesof the μApp with API-Gateway topologies (like in thePoint-to-Point topology).There are cases in which the OA planner does not out-put a placement. In some cases, forμApps with fewer than20 microservices, Z3 cannot relax the constraints definedin the optimization specification (see Section 5.5). If oneof the constraints cannot be satisfied for some reason, theoptimization cannot be resolved. This is not a limitationof Z3, but rather our design decision to require an all ornothing solution. TheOA planner may also fail to producea placement by timing out onμApps withmanymicroser-vices (in our experiments, we restrict Z3 to 10 min.). InFig. 7c and d, the squares with an ‘X’ are for experiments inwhich the constraints could not be satisfied. The squareswith an ‘\’ are for experiments in which Z3 could not finishin under 10 min.Figure 7c and d show that the topology affects thecomputation of the placement optimization. Planner OASampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 19 of 30a bc dFig. 7 The percentage of hosts saved for different configurations and planners. a API-Gateway topology and planner HBA, b Point-to-Point topologyand planner HBA, c API-Gateway topology and planner OA, d Point-to-Point topology and planner OAproduces better results working on dense μApps graphs(Point-to-Point topology) than sparse ones. The plan-ner has more data to compute better solutions as denseμApps have more affinities (links between microservices)than sparse applications (API-Gateway topology). Plan-ner OA modified has no significant results and is worsethan others planners: it cannot work onμApps larger than20 microservices, neither yield results better than otherplanners (expect planner HBA applied on point-to-pointtopology).Due to the exhaustion of resources to compute theplacement using an SMT solver, planner OA modifieddoes not work with more than 20 microservices. Con-versely, planner HBA has not this limitation and worksappropriately up to 1000 microservices. Figure 7c and dshow that plannerOAmodified works better on the Point-to-Point topology and can save up to 40% of the usedhosts initially. Although plannerOA can save up to 90% ofhosts when working on the API-Gateway topology, thereare many situations in which this planner can not opti-mize μApps having more than 12 microservices. This facthappens because planner OA modified assumes that thecurrent placement is already good enough for the execu-tion, and it is not necessary to move further microservicesto new places.Figures 8, 9, 10 present the time to compute an adapta-tion plan. Figure 8 shows that planner HBA spends mostof the adaptation time collecting cluster data (MonitoringTime). The monitoring step is computationally expensivebecause it has to collect a lot of data over the network andtransform them to draw up the model.The impact of the analysis (Analysis Time) while com-puting the adaptation is small when compared withthe monitoring time. However, when we observe sce-narios having a large number of messages(105), theanalysis impact is more expressive. During the adapta-tion process, the analyzer traverses the model and com-putes the affinities (see Eq. 1). Although part of thecalculation (total number of messages and total dataexchanged between microservices) is already computedand kept in the model, the analyzer is still traversingall messages to check the microservices they link. Theplanning step of planner HBA is faster than the otherplanners because it uses a simple algorithm to com-pute the placement. As described in Section 5.5, thealgorithm iterates over microservice tuples and tries to fittwo associated microservices in just one of the two hosts.However, when planner HBA is applied on large μApps(more than 500microservices), the planning time is within15% and 60% of the whole time to compute an adaptationplan. This result is apparent when the planner is used indense μApps, i.e., Point-to-Point topologies.Similarly to planner HBA, the impact of the analysiswhile computing the adaptation using plannerOA is small,as shown in Fig. 10. The use of planner OA modified hasa better performance to compute an adaptation plan thanplanner OA, but planner OA modified cannot guaranteethat the results are optimal. The use of planner OA mod-ified enabled us to compute a quasi-optimal placement ofup to 20 microservices and hosts in less than 4 s. Further-more, as shown in Fig. 9, due to the brute force of the SMTsolver, planner OA, consumes so much time computingan adaptation plan (planning time) that monitoring andanalysis times become irrelevant to the total time. Finally,the NP-Hard nature of the problem makes planner OAunable to compute a configuration having more than 20Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 20 of 30abcFig. 8 Time to compute an adaptation plan - Planner HBA. a 103 messages, b 104 messages, c 105 messagesmicroservices. In the experiments, we set a timeout of 10min. to compute an adaptation and in most cases, plannerOA extrapolates this time.The time to compute an adaptation plan using plan-ners HBA, OA and OA modified varies according to theμApp topology as shown in Figs. 8, 9, and 10. The timeto compute the adaptation of API topologies is, in gen-eral, better than one to compute the P2P topologies. Thisfact happens because the P2P topology has more affini-ties (links) between the microservices which make thecomputation of the adaptation plan (optimization) harder.Finally, once the adaptation mechanism computes thenew placement, the executor applies the changes by mov-ing the microservices. In the case of Kubernetes, Fig. 11depicts the average time and its standard deviation formoving microservices by using Kubernetes, these val-ues show that the time to move microservices scaleslinearly.Analyzing the adaptation scenarios using planner HBA(Fig. 8), the executor has the longest duration as shownin Table 2. The executor takes around five seconds tomove up to 100 microservices that is a reasonable sizefor a μApp, up to 60 s to move 1000 microservices(large μApp). The total time for computing an adapta-tion plan takes around 0.03 and 3.06 s for μApps up to200 microservices, and 103 and 105 messages exchanged,respectively. Meanwhile, it takes 0.21 and 3.28 secondsfor computing an adaptation plan for μApps up to 1000microservices, and 103 and 105 messages exchanged,respectively.We cannot reasonably compare the reconfigurationtime of planners OA and OA modified. These plannerscannot compute an adaptation plan for more than 20microservices. Planner OA modified only moves a fewmicroservices and these moves do not necessarily opti-mize the final placement of the μApp. In turn, plannerOA might take more than 15 seconds on average to com-pute an adaptation plan for μApps with fewer than 20microservices. In some cases, planner OA may take morethan 150 s with 20 microservices.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 21 of 30abcFig. 9 Time to compute an adaptation plan - Planner OA, a 103 messages, b 104 messages, c 105 messagesWhen compared to the time to compute an adaptationplan using planner HBA, the executor starts to take a longtime (more than 10 s) to reconfigure μApps with 200microservices. This time increase linearly, and the execu-tor can take up to 60 s to reconfigure a μApp with 1000microservices.7.2 Empirical evaluationThe objective of the empirical evaluation was to under-stand the impact of REMaP on an existing μApp, namelySock-shop and to measure the resource consumption ofREMaP. Sock-Shop is an open-source μApp of an e-commerce site that sells socks, and whose architecture isshown in Fig. 1. It has beenwidely adopted as a benchmarkto evaluate microservices [11] and includes ten microser-vices and five databases. The microservices are imple-mented in Go, Java, and Node.JS, and the databases usedare MySQL and MongoDB.Sock-Shop was deployed on Kubernetes and config-ured on top of Basic A4 VMs in Azure26. Initially,the default Kubernetes scheduling strategy deploys eachmicroservice. During the execution, we used REMaPto optimize the placement of the microservices bycollocating some of them according to the gener-ated adaptation plans. During the experiments, wegradually increased the number of requests to Sock-shop’s front-end until it saturated and began to droprequests.In the first experiments, we measured the round triptime (RTT - y-axis in Figs. 12, 13 and 14) of a requestto Shock-shop. This action exercises a purchase that is themost significant flow of execution within Sock-shop andactivates 9 microservices.In all experiments, the adaptation was carried out usingplanners HBA and OA. We do not use planner OA mod-ified due to the poor results achieved in the mock exper-iments. All empirical experiments have the Sock-shopdeployed by the Kubernetes without any optimization asthe baseline.We conducted these experiments with two differentversions of the μApp: Sock-shop fully instrumented andSock-shop partially instrumented. In the first case, allmicroservices are instrumented to collect all messagesexchanged. This strategy allows REMaP to build up theSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 22 of 30abcFig. 10 Time to compute an adaptation plan - Planner OA Modified, a 103 messages, b 104 messages, c 105 messageswhole graph of the μApp. In the second case, six Javamicroservices are instrumented to collect their inboundand outgoing messages. In this case, REMaP builds up apartial graph of the application. Besides, we evaluated twodeployment strategies:Fig. 11 Average time and its standard deviation to movemicroservices using Kubernetes1. Fully distributed (1-1): The cluster has the samenumber of hosts and microservices and eachmicroservice executes alone in a host;2. Partially distributed (N-1): The cluster has 50% ofhosts of the fully distributed deployment and somemicroservices are co-located in a host.In both cases, Kubernetes is responsible for decid-ing where to put each microservice. We summarize theparameters of our experiments in Table 3.To show the instrumentation impact on the μApp,we run an experiment comparing the Sock-shop per-formance. In this scenario, Sock-shop was deployed byKubernetes, and REMaP applies no optimization on theμApp configuration.Table 2 Time comparison for computing an adaptation plan(Planner HBA) and executing it on the cluster#μServices Computing adaptation plan (s) Executor(s)103 msgs 104 msgs 105 msgs200 0.05 - 0.06 0.25 - 0.26 2.97 - 3.06 51000 0.21 - 0.27 0.41 - 0.46 3.19 - 3.28 60Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 23 of 30As expected, the instrumented version of Sock-shopplaced without optimization has the worst performancethan the non-instrumented one as shown in Fig. 12.When Sock-shop is instrumented and deployed into asmall cluster, and the microservices are co-located (N:1– N microservices per host) without any placement opti-mization (regular Kubernetes), we observe an overheadof approximately 58% on the RTT time when comparedwith the non-instrumented version (see Fig. 12). In thedeployment in a large cluster without co-locations (1:1– 1 microservice per host) and placement optimization,we observed an overhead of approximately 200% on theRTT (see Fig. 12). This high overhead is caused by the factthat all microservices are remote to each other (latencydegradation) and remote to Zipkin. In this configura-tion, metadata are stored in Zipkin before and after eachrequest between microservices. In N:1 deployment, thereare several microservices co-located with each other andco-located with Zipkin, which reduces the latency and hasa better overall performance.μApps are highly distributed and to observe their run-time behaviour is a hard task. The instrumentation ofμApps is necessary to observe and track the behaviourof the μApp at runtime, which is required for reliablemanagement. Hence, we used the instrumented version ofSock-shop configured with Kubernetes as a baseline forthe following experiments.Although the instrumentation is necessary, it can bepartial. For instance, engineers may choose to only instru-ment some microservices. To evaluate this scenario, wecarried out an experiment to compare the performance ofthe fully and partially instrumented Sock-shop along withdifferent optimization strategies. The partial instrumen-tation included four of ten microservices. Figure 13a andb show the results.In the N:1 deployment, only the optimization carriedout by the OA planner outperforms the results obtainedwith regular Kubernetes. By contrast, in the 1:1 deploy-ment, all planners improve the μApp performance. Theresults show that the optimization computed for a par-tially instrumented μApp only improves its performanceif it is fully distributed. In the case in which there aremicroservices co-located before the optimization, theoptimization may degrade the performance of the μApp.The lack of a full application graph, due to the partialinstrumentation, leads the optimization to ignore criticalmicroservices in a workflow in such a way that the latencyof these remote microservices degrades the performanceof the μApp.The previous experiments only optimized the μApp bymigrating stateless microservices. However, in some sce-narios, stateful microservices should be moved. Currently,REMaP cannot sync data after the migration. However, itis possible to evaluate the impact of co-locating I/O boundmicroservices. The next experiment evaluates the effecton the μApp by allowing the migration of stateful andstateless (together), and stateless only microservices.In all cases (Fig. 14), the co-location of several state-ful microservices degrades the performance. However,in the 1:1 deployment, planner OA migrating statefulmicroservices reaches the baseline and planner HBA stillimproves the μApp performance, even when movingstateful microservice, as shown in Fig. 14b.REMaP, like other management tools, does not use I/Ometrics from the μApp execution to compute the place-ment of microservices. As data stores are usually I/Obound, when co-located, they jeopardize the μApp per-formance by degrading theμApp performance up to 148%and 7% in N-1 and 1-1 deployments, respectively. More-over, due to the architecture of Sock-shop (see Fig. 1), eachFig. 12 Sock-shop non-instrumented (Kubernetes) versus instrumented (Kubernetes)Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 24 of 30abFig. 13 RTT comparison when Sock-shop is fully instrumented and non-instrumented. a N:1 Deployment, b 1:1 Deploymentstateless microservice is co-located with its respectivestateful microservice (data store). Planner OA, however,assumes that all pairs are part of a hub and the whole hubshould be co-located in a single host if CPU and memoryrequirements are satisfied. The I/O contention degradesthe overall performance of the μApp.In addition to the impact of different planners on theμApp performance, we also evaluated the number ofresources they can save in the cluster and comparedagainst the Kubernetes deployment. Table 4 shows thesecomparisons. We can observe that deployment in 1:1saved more hosts. Kubernetes attaches a microservice toa node following a variation of the First-Fit algorithm,i.e., the nodes are listed and sorted based on the num-ber of resources available, and then each microservice isattached to the first node in the list. If there are moremicroservices than nodes, the process repeats until allmicroservices have been attached, or there are no moreresources available.Similarly to planner HBA, the Kubernetes schedulercannot guarantee an optimal placement of microservices.Unlike Kubernetes, however, the HBA planner uses theaffinities to guide the placement process. In this way, plan-ner HBA reduces the resources used while degrading theμApp performance by 30%.Finally, planner OA guarantees an optimal placementand improves the performance of the μApp in 1:1 deploy-ment. However, in the N:1 deployment, the performanceis worse because REMaP is unable to move cluster-dedicated components, i.e., containers used for providinghealth information about the cluster and microserviceslike InfluxDB and Zipkin. Hence, REMaP co-locates someSock-shop microservices with these types of contain-ers, degrading the μApp performance. As planner HBASampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 25 of 30abFig. 14 RTT comparison when optimization is applied considering the migration of stateful microservices or stateless only. a N:1 Deployment, b 1:1DeploymentSampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 26 of 30Table 3 Parameters of the empirical experimentParameter (factor) Values (levels)Planner to compute placement Kubernetes, Planners HBA/OANumber of hosts available 7 (N:1), 15 (1:1)Microservices able to migrate Stateless only, stateless and statefulInstrumentation of the μApp Fully/partially instrumentedmigrates fewer microservices than planner OA, this limi-tation of REMaP is less apparent.To conclude our empirical evaluation, we measureREMaP’s resource consumption when optimizing theSock-shop placement. The resource consumption ofREMaP was measured by computing the optimization ofSock-shop 100 times in a row. Although this is an unreal-istic behaviour, it was useful to show how REMaP worksin a high demand scenario. The results are presented inFig. 15.Planner HBA consumes approximately 1.65GB of mem-ory (see Fig. 15a) and planner OA consumes 0.8GB (seeFig. 15b). For a μApp like Sock-shop, planner OA hasa better memory usage due to the technologies usedin the Z3 implementation. Z3 is implemented in C++and REMaP uses a Python binding to call Z3. PlannerHBA, by contrast, is implemented in Java. According to[25] Java is approximately 4.5× more memory consum-ing than C++ and 2.15× more memory consuming thanPython. These characteristics help us to explain its cur-rent memory usage. However, for bigger μApps, plannerOA can quickly run out of memory. Due to the brute-forceapproach used by the SMT solver: Z3 tests all possibili-ties when searching for a solution, and its memory usagegrows exponentially according to input. Planner HBA, onthe other hand, has memory usage that is polynomiallybounded by the input, making the growth of its memoryusage slower than planner OA.The CPU consumption of planner OA is highly vari-able: a consequence of the Z3 execution. When Z3 startsto run, its CPU consumption grows quickly and remainshigh while the optimization is computed. As shown inSection 7.1, the calculation of an adaption for μApps upto 20 microservices can take up to one minute. PlannerTable 4 (#hosts saved by REMaP)/(original Kubernetesdeployment) by each placement optimizationKubernetes deployment Stateful StatelessHBA OA HBA OAN:1 instrumented 2/7 (28%) 3/7 (42%) 1/7 (14%) 2/7 (28%)non-instrumented 2/7 (28%) 3/7 (42%) 1/7 (14%) 2/7 (28%)1:1 instrumented 5/15 (33%) 6/15 (40%) 2/15 (13%) 3/15 (20%)non-instrumented 5/15 (33%) 6/15 (40%) 2/15 (13%) 3/15 (20%)OA takes around 8s to compute an optimization and exe-cutes the other steps of the adaptation process in 138ms.The time to compute optimization masks the CPU usageof the other adaptation steps in the plot.By contrast, planner HBA, shown in Fig. 15a, has a morestable CPU consumption as its optimization algorithm isless complex (asymptotically) than planner OA. This factmakes the time for computing each step of the adaptationfaster than planner OA. As a consequence, the CPU isbusy most of the time. Thus, planner HBA has a slightlyhigher CPU consumption than planner OA.To summarize, planner OA is recommended if theμApp is fully instrumented and has fewer than 20microservices. The average time for REMaP optimizationof a μApp using planner OA is 8.5s.Considering μApps bigger than 20 microservices, plan-ner HBA and Kubernetes are better choices. If there arefew hosts available and the μApp performance is critical,Kubernetes is preferred over REMaP. However, if resourceusage is vital, REMaP with the HBA planner is the betterchoice. Finally, if there are many resources available, i.e.,more hosts than microservices, planner HBA should beselected. The average time for REMaP to optimize a μAppusing the HBA planner is 3.5s.It is worth observing that while dozens of seconds seemto be a long time to compute and execute an adaptationplan, in a real setting this result is sufficiently fast. AμAppthat is too eager to adapt is as bad as one that takes toolong. As the proposed system is feedback-oriented, it isessential to take into account that actions take a while toimpact the metrics. Hence, in general, mechanisms thatavoid oscillations, over- and under-shooting, are essential.8 Related work8.1 Runtime Adaptation ofμAppsMicroservices practitioners have identified the need fortools to manage μApps [1] automatically. App-Bissect[7] uses runtime information to decide when to rollbackthe μApp to a previous version and improves μApp per-formance. Existing approaches also focus on automaticscaling in/out of microservices [6, 26]. None of theseapproaches investigate the flexibility of μApps to exploreautomatic runtime placement options [27].8.2 Microservice placementSome initiatives focus on improving the scheduling ofmicroservices across a cluster. Gabbrielli et al. [28] usestatic values of resource demands to deploy microser-vices, similar to commercial tools such as Kubernetesand Docker Swarm. Bhamare et al. [29] present a multi-objective algorithm to schedule microservices on a clus-ter taking into account function chains to optimize theexecution of μApps. However, they neither monitor run-time attributes nor reconfigure the μApps.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 27 of 30abFig. 15 CPU and memory consumption of Planner HBA and Planner OA CPU along 100 executions in sequence. a Planner HBA, b Planner OA8.3 Allocation based on affinitySeveral strategies address the allocation of VMs on cloudsto improve different aspects of non-microservice-basedapplications, such as cost and QoS [30].Placement and runtime migration of VMs consideringtheir affinities have also been studied [3, 31–35]. In gen-eral, these approaches mainly group VMs based on theircommunication affinity to reduce the overhead imposedby communication latency.Unlike our approach, these studies do not detect theactual usage of resources and allocate VMs based only onstatic resource values. Moreover, due to the monolithicnature of applications deployed in VMs, it is not commonto reconfigure the VM placement to improve applications’requirements since they are not dynamic like μApps.Finally, in addition to communication affinity, otherkinds of affinities have been explored. Some examples aredata affinity [36] that tries to deploy the application closeto the data being used, and affinity by feature [37], inwhich an application is deployed according to availablehost configuration.8.4 Allocation in High-Performance ComputingIn high-performance computing (HPC), there are severalaffinity-based strategies to allocate jobs (processes, VMsor containers). The most common approaches computethe affinity of jobs and raw resources (e.g., CPU, GPU,I/O), and are not focused on inter jobs. For instance, [38]calculates the affinities between resources and jobs in sucha way that an affinity is a metric of how much a resourcecontributes to the execution of a job. Yokoyama et al.[39] calculate the affinity based on howmuch competitionexists between jobs for a given resource. More sophisti-cated affinities may consider an inter-process relationshipto allocate processes to the same virtual CPU and/orvirtual CPUs to the same physical CPU, avoiding cachemisses along the application execution [40]. In all cases,the allocation is on the process and CPU levels, at a lowerlevel than REMaP.There are works in which affinities are calculated basedon job communication, like REMaP. AAGA [3], CIVSched[41], and Starling [31] are some examples of this approach.In general, this prior work computes the jobs’ affinitybased on the bandwidth between them. The algorithmsused are in a sense a variation of the First-Fit algorithm [9],which tries to fit related jobs into a node with the availableresources. The REMaP’s planner HBA is also inspired bythe First-Fit algorithm. Finally, like REMaP, some of thesealgorithms [31] can reconfigure the allocation of jobs atruntime based on changes in the communication patternsof the application.Finally, like μApps, the HPC domain has no frame-work to unify several metrics of the environment tocompute affinities. Broquedis et al. [42] proposes a uni-fied interface to gather resources in an HPC clusternamed hwloc. The idea of hwloc is to provide a unifiedview of low-level resources is a similar way to REMaP.However, hwloc was designed only to provide an inter-face that can be used by another scheduler. REMaP, inturn, is a complete solution to update the placementof the elements of a μApp, is such a way that it mayuse hwloc to draw up a more sophisticated model byusing finer grained data of the physical machines in acluster.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 28 of 308.5 Models for microservicesRademacher [43] surveyed the use of models in microser-vice and service-oriented architectures. Models havebeen used mostly at development/specification time,and to the best of our knowledge, there is no workusing model@run.time in the microservice domain. Der-akhshanmanesh [44] shared his vision of how modelsmight be used across the full software lifecycle, includingruntime, to evolve applications. He proposes the use ofdomain-specific modelling languages (DSML) and modeltransformations to define and evolve a microservice appli-cation at the architectural level.Dullmann and van Hoorn [45] have used modelsfor engineering microservice testbeds. Developers cre-ate models and generate Java code and deployment files(Maven, Docker, and Kubernetes). Themicroservices gen-erated are automatically instrumented to collect metricsat runtime.Microservices Ambients [46] uses static and dynamicanalysis of application to generate a model to transformmonolithic architectures into microservice-based archi-tectures.Zúñiga-Prieto et al. [47] propose a model, inspired bySoaML, to integrate microservices. Developers can spec-ify the integration, describing the integration logic andarchitectural impact of integration, without taking intoconsideration the particularities of the target cloud envi-ronment. In the end, the model is used to generate skele-tons of microservices, the integration logic, and scripts toautomatically deploy and integrate the microservices.MicroArt [48] makes reverse engineering of a μApp,through static and dynamic analysis of code repositoryand μApp deployment in a cluster, to create an architec-tural model. The model is refined by the μApp architec-ture, creating a global view of the application, but it doesnot include any runtime information, such as resourceusage or messages exchanged. The generated model isused for multiple purposes, for example, architecturalreasoning, analysis, and documentation.Leitner et al. [49] present CostHat, an approach tomodel deployment financial cost. The model is generatedby analyzing messages exchanged among microservices.CostHat uses the model to calculate costs due to I/Ooperations, processing, remote calls, and so on.9 Conclusion and future directionsDespite the flexibility provided by microservices, existingmanagement tools do not use valuable runtime information to adapt μApps. We propose REMaP, a platform-independent runtime adaptation mechanism to reconfig-ure the placement of microservices in μApps based ontheir communication affinities and resources usage. Atthe core of our approach is a novel optimization thatchanges the placement of microservices at runtime. Wepresent our design and implementation for monitoringand constructing the runtime models of μApps and usethese models to adapt the application by using the causalconnection between the model and the μApp.Our work shows that by updating the placement ofμApps at runtime, we can save up to 80% of hostsbeing used. In some cases this causes a performancedegradation for theμApp, but in some cases this improvesμApp performance. We also show that it is difficult toachieve an optimal placement due to the complexity ofthe placement problem. However, the results obtainedwith our heuristic algorithm highlights the potentialof approximation algorithms to improve the place-ment of μApps to reduce resources usage and improveperformance.Our implementation uses triggers, defined by engineers,to start the adaptation, i.e., interval-based triggers. Infuture work we will consider adaptation triggers that donot require human involvement. Hence, we plan to extendthe proposed solution to trigger the adaptation based onstatistical analysis of the μApp behaviour.We also aim to extend the adaptation strategy byimproving the analysis and planner phases to find affinityhubs in μApps rather than simple microservices tuples.Our experiments highlight that the use of hubs by approx-imation algorithms may produce better results than co-location of simple tuples.This work also shows that the number of messagesfetched from the μApp does not affect the placementcomputation. Hence, we expect to update our solution tocollect the minimum data necessary to compute the adap-tation. As the monitoring is a performance bottleneck forour approach, this improvement is a necessary next step.However, the number of instrumented microservices iscritical for an optimal placement computation. In futurework, we will develop a lighter instrumentation strategyfor μApps.Themigration ofmicroservices at runtime uses the APIsexposed by the management tools. However, in practice,these APIs are insufficient. For example, the manage-ment tools do not expose primitives to move individualmicroservice instances during scaling. We plan to inves-tigate extensions to existing management tools to bettersupport microservice migration.Finally, in this work, we used a scale-free networkmodel to represent mock μApps. We will study real-world μApps to validate the underlying hypothesis thatpower-law models, like the Barabási-Albert model, areappropriate for modeling μApps.Looking forward, we hope that the proposed approachwill be adopted by management tools to further automateμApp management using non-trivial runtime data, suchas communication patterns and historical resource usagedata.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 29 of 30Endnotes1 https://www.oasis-open.org/committees/wsbpel2 https://kubernetes.io3 https://docs.docker.com/engine/swarm4https://microservices-demo.github.io5 http://microservices.io/patterns/reliability/circuit-breaker.html6 https://github.com/google/cadvisor7 https://prometheus.io8 https://www.influxdata.com9https://www.fluentd.org10 https://www.elastic.co/products/logstash11 https://www.elastic.co/products/elasticsearch12 https://aws.amazon.com/cloudwatch13 https://zipkin.io14 https://uber.github.io/jaeger15 https://www.elastic.com/products/kibana16 https://jaxenter.com/nobody-puts-java-container-139373.html17 https://stackoverflow.com/questions/36759132/why-does-docker-crash-on-high-memory-usage18 https://docs.influxdata.com/influxdb19 http://zipkin.io20 https://github.com/kubernetes/heapster21 https://travis-ci.org22 https://www.eclipse.org/modeling/emf23 https://github.com/Z3Prover/z324 https://microservices-demo.github.io25 https://networkx.github.io26 https://azure.microsoft.comAcknowledgmentsWe thank Dr. Sam Bayless for sharing his expertise on SMT solvers, and forhelping us with Microsoft Z3.FundingThis work is supported by:– CAPES Brazil – grant 88881.132774/2016-01, and– FACEPE Brazil – grant IBPG- 0892-1.03/13.Availability of data andmaterialsPlease contact the author for data requests.Authors’ contributionsAS is a Ph.D. candidate and this paper presents the primary outcome of hisresearch. AS was responsible for the identification of the problem, design thesolution, and carry out the experiments shown in this paper. JR, IB, and NRparticipated in the design and coordination of the study. Finally, JR, IB, and NRhelped to draft the manuscript. All authors read and approved the finalmanuscript.Authors’ informationM.Sc. AS is a Ph.D. candidate in the Centre of Informatics of Federal Universityof Pernambuco, Brazil. He received his M.Sc. in Computer Science from theFederal University of Goiás, Brazil.Ph.D. JR is an Assistant Professor in the Department of Electrical and ComputerEngineering at the University of British Columbia, Canada. She received herPh.D. in Computer Science from the University of Toronto, Canada.Ph.D. IB is an Assistant Professor in the Department of Computer Science atthe University of British Columbia, Canada. He received his Ph.D. in ComputerScience from the University of Washington, United States.Ph.D. NR is an Associate Professor at Center of Informatics at the UniversityFederal of Pernambuco, Brazil. He received his Ph.D. in Computer Science fromthe Federal University of Pernambuco, Brazil.Competing interestsThe authors declare that they have no competing interests.Publisher’s NoteSpringer Nature remains neutral with regard to jurisdictional claims inpublished maps and institutional affiliations.Author details1Center of Informatics, UFPE, Recife, Brazil. 2Department of Electrical andComputer Engineering, UBC, Vancouver, Canada. 3Department of ComputerScience, UBC, Vancouver, Canada.Received: 21 April 2018 Accepted: 11 November 2018References1. Newman S. Building Microservices. O’Reilly Media; 2015. p. 280.2. Zimmermann O. Microservices Tenets: Agile Approach to ServiceDevelopment and Deployment. Comput Sci Res Dev. 2016;32(3):301–10.3. Chen J, Chiew K, Ye D, Zhu L, Chen W. AAGA: Affinity-aware groupingfor allocation of virtual machines. In: Advanced Information Networkingand Applications (AINA). 2013. p. 235–42.4. Sampaio Jr A, Kadiyala H, Hu B, Steinbacher J, Erwin T, Rosa N,Beschastnikh I, Rubin J. Supporting evolving microservices. In:International Conference on Software Maintenance and Evolution(ICSME) - Track NIER. 2017. p. 539–43.5. IBM. An architectural blueprint for autonomic computing. In: IBM WhitePaper. IBM Corporation; 2005. p. 34.6. Florio L, Di Nitto E. Gru: An Approach to Introduce DecentralizedAutonomic Behavior in Microservices Architectures. In: AutonomicComputing (ICAC), 2016 IEEE International Conference on. 2016.p. 357–62.7. Rajagopalan S, Jamjoom H. App-Bisect: autonomous healing formicroservice-based apps. In: Conference on Hot Topics in CloudComputing. 2015. p. 16.8. Barrett CW, Sebastiani R, Seshia SA, Tinelli C, et al. Satisfiability modulotheories. Handb Satisfiability. 2009;185:825–85.9. Dosa G. In: Kao M-Y, editor. First Fit Algorithm for Bin Packing. Boston:Springer; 2008. pp. 1–5.10. Casati F. Service-oriented computing. ACM SIGWEB Newsletter.2007;2007(Winter):1.11. Aderaldo CM, Mendonca NC, Pahl C, Jamshidi P. BenchmarkRequirements for Microservices Architecture Research. In: 1st InternationalWorkshop on Establishing the Community-Wide Infrastructure forArchitecture-Based Software Engineering (ECASE). IEEE; 2017. p. 8–13.12. Jordan D, Evdemon J. Web Services Business Process ExecutionLanguage Version 2.0. 2007. https://docs.oasis-open.org/wsbpel/2.0/wsbpel-v2.0.html. Accessed Mar 2018.13. Huebscher MC, McCann JA. A survey of autonomic computing—degrees,models, and applications. ACM Comput Surv. 2008;40(3):1–28.14. Szvetits M, Zdun U. Systematic literature review of the objectives,techniques, kinds, and architectures of models at runtime. Software &Systems Modeling. 2013.15. Krupitzer C, Roth FM, VanSyckel S, Schiele G, Becker C. A survey onengineering approaches for self-adaptive systems. Pervasive MobComput. 2014;17:184–206.16. Blair G, Bencomo N, France RB. Models@run.time. Computer.2009;42(10):22–27.17. Maes P. Concepts and experiments in computational reflection. ACMSIGPLAN Notices. 1987;22(12):147–55.18. Weik MH. truncated binary exponential backoff. Boston: Springer; 2001.p. 1840.Sampaio Jr. et al. Journal of Internet Services and Applications            (2019) 10:4 Page 30 of 3019. Ward JS, Barker A. Observing the clouds: a survey and taxonomy of cloudmonitoring. J Cloud Comput. 2014;3(1). https://doi.org/10.1186/s13677-014-0024-2.20. Korte B, Vygen J. Bin-Packing. In: Combinatorial Optimization: Theory andAlgorithms. Berlin Heidelberg: Springer; 2006. p. 426–441.21. Chekuri C, Khanna S. On multidimensional packing problems. J Comput.2004;33(4):837–51.22. Christensen HI, Khan A, Pokutta S, Tetali P. Multidimensional bin packingand other related problems: A survey; 2016. https://pdfs.semanticscholar.org/bbcf/4ca2524cd50fdb03b180aa5f98d2daa759ce.pdf. AccessedMarch 2018.23. Biere A, Heule M, van Maaren H, Walsh T. Handbook of Satisfiability, vol.185 of Frontiers in Artificial Intelligence and Applications. IOS Press; 2009.24. Barabási A-L, Albert R. Emergence of scaling in random networks.science. 1999;286(5439):509–12.25. Pereira R, Couto M, Ribeiro F, Rua R, Cunha J, Fernandes JaP, Saraiva Ja.Energy efficiency across programming languages: How do energy, time,and memory relate?. In: Proceedings of the 10th ACM SIGPLANInternational Conference on Software Language Engineering. SLE 2017.New York: ACM; 2017. p. 256–67.26. Toffetti G, Brunner S, Blöchlinger M, Spillner J, Bohnert TM.Self-managing cloud-native applications: Design, implementation, andexperience. Futur Gener Comput Syst. 2017;72:165–79.27. Hassan S, Bahsoon R. Microservices and their design trade-offs: Aself-adaptive roadmap. In: Services Computing (SCC). 2016. p. 813–8.28. Gabbrielli M, Giallorenzo S, Guidi C, Mauro J, Montesi F.Self-reconfiguring microservices. In: Theory and Practice of FormalMethods. Springer; 2016. p. 194–210.29. Bhamare D, Samaka M, Erbad A, Jain R, Gupta L, Chan HA.Multi-Objective Scheduling of Micro-Services for Optimal ServiceFunction Chains. In: International Conference on Communications (ICC).2017. p. 1–6.30. Singh AN, Prakash S. Challenges and opportunities of resource allocationin cloud computing: A survey. In: Computing for Sustainable GlobalDevelopment (INDIACom), 2015 2nd International Conference On. 2015.p. 2047–51.31. Sonnek J, Greensky J, Reutiman R, Chandra A. Starling: Minimizingcommunication overhead in virtualized computing platforms usingdecentralized affinity-aware migration. In: Parallel Processing (ICPP), 201039th International Conference On. 2010. p. 228–37.32. Acharya S, D’ Mello DA. A taxonomy of Live Virtual Machine (VM)Migration mechanisms in cloud computing environment. In: A taxonomyof Live Virtual Machine (VM) Migration mechanisms in cloud computingenvironment. 2013. p. 809–15.33. Leelipushpam PGJ, Sharmila J. Live VM migration techniques in cloudenvironment—a survey. In: Information & Communication Technologies(ICT). 2013. p. 408–13.34. Pachorkar N, Ingle R. Multi-dimensional affinity aware VM placementalgorithm in cloud computing. Int J Adv Comput Res. 2013;3(4):121.35. Lu T, Stuart M, Tang K, He X. Clique migration: Affinity grouping ofvirtual machines for inter-cloud live migration. In: Networking,Architecture, and Storage (NAS). IEEE; 2014. p. 216–25.36. Jiang J, Sun S, Sekar V, Zhang H. Pytheas: Enabling Data-Driven Qualityof Experience Optimization Using Group-Based Exploration-Exploitation.In: NSDI; 2017. p. 393–406.37. Ramakrishnan A, Naqvi SNZ, Bhatti ZW, Preuveneers D, Berbers Y.Learning deployment trade-offs for self-optimization of Internet of Thingsapplications. In: Proceedings of the 10th International Conference onAutonomic Computing, ICAC 2013. 2013. p. 213–24.38. Lee G, Katz RH. Heterogeneity-aware resource allocation and schedulingin the cloud. In: HotCloud; 2011.39. Yokoyama D, Schulze B, Kloh H, Bandini M, Rebello V. Affinity awarescheduling model of cluster nodes in private clouds. J Netw ComputAppl. 2017;95:94–104.40. Li Z, Bai Y, Zhang H, Ma Y. Affinity-aware dynamic pinning schedulingfor virtual machines. In: Cloud Computing Technology and Science(CloudCom). IEEE; 2010. p. 242–9.41. Guan B, Wu J, Wang Y, Khan S. CIVSched: a communication-awareinter-VM scheduling technique for decreased network latency betweenco-located VMs. Trans Cloud Comput. 2014;2(3):320–332.42. Broquedis F, Clet-Ortega J, Moreaud S, Furmento N, Goglin B, MercierG, Thibault S, Namyst R. hwloc: A generic framework for managinghardware affinities in HPC applications. In: Parallel, Distributed andNetwork-Based Processing (PDP). 2010. p. 180–6.43. Rademacher F, Sachweh S, Zundorf A. Differences betweenModel-Driven Development of Service-Oriented and MicroserviceArchitecture. In: 2017 IEEE International Conference on SoftwareArchitecture Workshops (ICSAW); 2017. p. 38–45.44. Derakhshanmanesh M, Grieger M. Model-Integrating Microservices: AVision Paper. In: Software Engineering (Workshops); 2016. p. 142–7.45. Düllmann TF, van Hoorn A. Model-driven Generation of MicroserviceArchitectures for Benchmarking Performance and Resilience EngineeringApproaches. In: International Conference on Performance EngineeringCompanion. 2017. p. 171–2.46. Hassan S, Ali N, Bahsoon R. Microservice Ambients: An ArchitecturalMeta-modelling Approach for Microservice Granularity. In: SoftwareArchitecture (ICSA). 2017. p. 1–10.47. Zúñiga-Prieto M, Insfran E, Abrahão S, Cano-Genoves C. Automation ofthe Incremental Integration of Microservices Architectures. In: Complexityin Information Systems Development. Springer; 2017. p. 51–68.48. Granchelli G, Cardarelli M, Di Francesco P, Malavolta I, Iovino L, Di SalleA. Towards Recovering the Software Architecture of Microservice-BasedSystems. In: Software Architecture Workshops (ICSAW), 2017 IEEEInternational Conference On; 2017. p. 46–53.49. Leitner P, Cito J, Stöckli E. Modelling and managing deployment costs ofmicroservice-based cloud applications. In: Proceedings of the 9thInternational Conference on Utility and Cloud Computing; 2016. p.165–74.


Citation Scheme:


Citations by CSL (citeproc-js)

Usage Statistics



Customize your widget with the following options, then copy and paste the code below into the HTML of your page to embed this item in your website.
                            <div id="ubcOpenCollectionsWidgetDisplay">
                            <script id="ubcOpenCollectionsWidget"
                            async >
IIIF logo Our image viewer uses the IIIF 2.0 standard. To load this item in other compatible viewers, use this url:


Related Items