Sepet düzeniSidecar pattern

Yalıtım ve kapsülleme sağlamak için uygulamanın bileşenlerini ayrı işleme veya kapsayıcıya dağıtın.Deploy components of an application into a separate process or container to provide isolation and encapsulation. Bu düzen aynı zamanda uygulamaların heterojen bileşenlerden ve teknolojilerden oluşmasına da olanak tanır.This pattern can also enable applications to be composed of heterogeneous components and technologies.

Düzen, motosikletlere eklenen sepetlere benzediğinden sepet olarak adlandırılmıştır.This pattern is named Sidecar because it resembles a sidecar attached to a motorcycle. Düzende sepet bir üst uygulamaya eklenir ve uygulamaya destekleyici özellikler sağlar.In the pattern, the sidecar is attached to a parent application and provides supporting features for the application. Sepet, üst uygulama ile birlikte oluşturulduğundan ve birlikte kullanımdan kaldırıldığından, üst uygulama ile aynı yaşam döngüsünü de paylaşır.The sidecar also shares the same lifecycle as the parent application, being created and retired alongside the parent. Sepet düzeni zaman zaman yardımcı düzen olarak adlandırılır ve bir ayrıştırma düzenidir.The sidecar pattern is sometimes referred to as the sidekick pattern and is a decomposition pattern.

Bağlam ve SorunContext and Problem

Uygulamalar ve hizmetler için genellikle izleme, günlüğe kaydetme, yapılandırma ve ağ hizmetleri gibi ilgili işlevler gerekir.Applications and services often require related functionality, such as monitoring, logging, configuration, and networking services. Bu çevre birimi görevleri ayrı bileşenler veya hizmetler olarak uygulanabilir.These peripheral tasks can be implemented as separate components or services.

Bunlar uygulama ile sıkı bir şekilde tümleştirilmişse uygulamayla aynı işlemde çalışarak, paylaşılan kaynakların verimli bir şekilde kullanılmasını sağlayabilir.If they are tightly integrated into the application, they can run in the same process as the application, making efficient use of shared resources. Ancak bu, yeterli düzeyde yalıtılmış olmadıkları ve bu bileşenlerden birinde oluşan kesintinin diğer bileşenleri veya tüm uygulamayı etkileyebileceği anlamına da gelir.However, this also means they are not well isolated, and an outage in one of these components can affect other components or the entire application. Ayrıca, genellikle üst uygulama ile aynı dil kullanılarak uygulanmaları gerekir.Also, they usually need to be implemented using the same language as the parent application. Bu nedenle, bileşen ve uygulama birbirine yakın bir şekilde bağlıdır.As a result, the component and the application have close interdependence on each other.

Uygulama hizmetlere ayrılmışsa her bir hizmet farklı diller ve teknolojiler kullanılarak oluşturulabilir.If the application is decomposed into services, then each service can be built using different languages and technologies. Bu, daha fazla esneklik sağlasa da her bileşenin kendi bağımlılıklarına sahip olduğu ve temel alınan platforma ve üst uygulamayla paylaşılan herhangi bir kaynağa erişim için dile özgü kitaplıklar gerektirdiği anlamına gelir.While this gives more flexibility, it means that each component has its own dependencies and requires language-specific libraries to access the underlying platform and any resources shared with the parent application. Ayrıca bu özelliklerin ayrı hizmetler olarak dağıtılması uygulamaya gecikme ekleyebilir.In addition, deploying these features as separate services can add latency to the application. Dile özgü bu arabirimler için kodun ve bağımlılıkların yönetilmesi, özellikle barındırma, dağıtım ve yönetim konularında karmaşıklığı da büyük ölçüde artırabilir.Managing the code and dependencies for these language-specific interfaces can also add considerable complexity, especially for hosting, deployment, and management.

ÇözümSolution

Bir dizi bütünsel görevi birincil uygulamayla birlikte bulundurun, ancak bunları kendi işlemine veya kapsayıcısına yerleştirerek platform hizmetleri için dillerde homojen bir arabirim sağlayın.Co-locate a cohesive set of tasks with the primary application, but place them inside their own process or container, providing a homogeneous interface for platform services across languages.

Sepet düzeni diyagramı

Sepet hizmeti, uygulamanın bir parçası olmayabilir ancak uygulamaya bağlıdır.A sidecar service is not necessarily part of the application, but is connected to it. Üst uygulamanın gittiği her yere bu hizmet de gider.It goes wherever the parent application goes. Sepetler birincil uygulama ile dağıtılan destekleyici işlemler veya hizmetlerdir.Sidecars are supporting processes or services that are deployed with the primary application. Motosikletlerde, sepet tek bir motosiklete bağlıdır ve her motosikletin kendi sepeti olabilir.On a motorcycle, the sidecar is attached to one motorcycle, and each motorcycle can have its own sidecar. Aynı şekilde sepet hizmeti de üst uygulamayla birlikte hareket eder.In the same way, a sidecar service shares the fate of its parent application. Uygulamanın her örneği için sepetin de bir örneği dağıtılır ve uygulama örneğiyle birlikte barındırılır.For each instance of the application, an instance of the sidecar is deployed and hosted alongside it.

Sepet düzeni kullanmanın avantajları şunlardır:Advantages of using a sidecar pattern include:

  • Sepet, çalışma zamanı ortamı ve programlama dili açısından birincil uygulamasından bağımsızdır; bu nedenle, her dil için bir sepet geliştirmeniz gerekmez.A sidecar is independent from its primary application in terms of runtime environment and programming language, so you don't need to develop one sidecar per language.

  • Sepet birincil uygulama ile aynı kaynaklara erişebilir.The sidecar can access the same resources as the primary application. Örneğin, bir sepet, hem sepet hem de birincil uygulama tarafından kullanılan sistem kaynaklarını izleyebilir.For example, a sidecar can monitor system resources used by both the sidecar and the primary application.

  • Sepetin birincil uygulamaya yakınlığı nedeniyle sepet ile birincil uygulama arasındaki iletişimde önemli bir gecikme olmaz.Because of its proximity to the primary application, there’s no significant latency when communicating between them.

  • Genişletilebilirlik mekanizması sağlamayan uygulamalar için bile sepet kullanabilir ve bunu birincil uygulama ile aynı ana bilgisayarda veya alt kapsayıcıda kendi işlemi olarak ekleyip işlevselliği genişletebilirsiniz.Even for applications that don’t provide an extensibility mechanism, you can use a sidecar to extend functionality by attaching it as own process in the same host or sub-container as the primary application.

Sepet düzeni genellikle kapsayıcılarla birlikte kullanılır ve sepet kapsayıcısı veya yardımcı kapsayıcı olarak adlandırılır.The sidecar pattern is often used with containers and referred to as a sidecar container or sidekick container.

Sorunlar ve Dikkat Edilmesi GerekenlerIssues and Considerations

  • Hizmetleri, işlemleri veya kapsayıcıları dağıtmak için kullanacağınız dağıtım ve paketleme biçimini gözden geçirin.Consider the deployment and packaging format you will use to deploy services, processes, or containers. Kapsayıcılar sepet düzeni için son derece uygundur.Containers are particularly well suited to the sidecar pattern.
  • Sepet hizmeti tasarlarken işlemler arası iletişim mekanizması konusunda dikkatli bir şekilde karar verin.When designing a sidecar service, carefully decide on the interprocess communication mechanism. Performans gereksinimleri nedeniyle kullanışsız olmayacaksa dilden veya çerçeveden bağımsız teknolojileri kullanmayı deneyin.Try to use language- or framework-agnostic technologies unless performance requirements make that impractical.
  • Bir sepete işlev eklemeden önce bunun ayrı bir hizmet olarak mı yoksa daha geleneksel bir daemon olarak mı daha iyi çalışacağını göz önünde bulundurun.Before putting functionality into a sidecar, consider whether it would work better as a separate service or a more traditional daemon.
  • Ayrıca işlevin kitaplık olarak veya geleneksel genişletme mekanizması kullanılarak uygulanıp uygulanamayacağını da dikkate alın.Also consider whether the functionality could be implemented as a library or using a traditional extension mechanism. Dile özgü kitaplıkların daha ayrıntılı bir tümleştirme düzeyi ve daha az ağ ek yükü olabilir.Language-specific libraries may have a deeper level of integration and less network overhead.

Bu düzenin kullanılması gerektiği durumlarWhen to Use this Pattern

Bu düzeni aşağıdaki durumlarda kullanın:Use this pattern when:

  • Birincil uygulamanızın heterojen bir dil ve çerçeve kullanır.Your primary application uses a heterogeneous set of languages and frameworks. Sepet hizmetinde bulunan bir bileşen farklı çerçeveler kullanılarak farklı dillerde yazılmış uygulamalar tarafından kullanılabilir.A component located in a sidecar service can be consumed by applications written in different languages using different frameworks.
  • Bir bileşenin uzak bir takıma veya farklı bir kuruluşa ait olması durumunda.A component is owned by a remote team or a different organization.
  • Bir bileşenin veya özelliğin uygulama ile aynı ana bilgisayarda birlikte bulunması gerektiğinde.A component or feature must be co-located on the same host as the application
  • Ana uygulamanızın genel yaşam döngüsünü paylaşan ancak bağımsız olarak güncelleştirilebilen bir hizmete ihtiyaç duymanız durumunda.You need a service that shares the overall lifecycle of your main application, but can be independently updated.
  • Belirli bir kaynak veya bileşen için kaynak sınırları üzerinde ayrıntılı denetime ihtiyaç duymanız durumunda.You need fine-grained control over resource limits for a particular resource or component. Örneğin, belirli bir bileşenin kullandığı bellek miktarını sınırlamak isteyebilirsiniz.For example, you may want to restrict the amount of memory a specific component uses. Bileşeni sepet olarak dağıtabilir ve bellek kullanımını ana uygulamadan bağımsız olarak yönetebilirsiniz.You can deploy the component as a sidecar and manage memory usage independently of the main application.

Bu düzen şu durumlarda uygun olmayabilir:This pattern may not be suitable:

  • İşlemler arası iletişimin en iyi duruma getirilmesi gerektiğinde.When interprocess communication needs to be optimized. Üst uygulama ile sepet hizmetleri arasındaki iletişim bir miktar ek yük (özellikle çağrılarda gecikme) içerir.Communication between a parent application and sidecar services includes some overhead, notably latency in the calls. Bu, sık iletişim kuran arabirimler için kabul edilebilir bir dengeleme biçimi olmayabilir.This may not be an acceptable trade-off for chatty interfaces.
  • Her örnek için bir sepet hizmeti dağıtmanın kaynak maliyetinin, yalıtım avantajına değmeyeceği küçük uygulamalar için.For small applications where the resource cost of deploying a sidecar service for each instance is not worth the advantage of isolation.
  • Hizmetin ana uygulamalardan farklı şekilde veya bağımsız olarak ölçeklendirilmesi gerektiğinde.When the service needs to scale differently than or independently from the main applications. Böyle bir durum söz konusuysa özelliği ayrı bir hizmet olarak dağıtmak daha kullanışlı olabilir.If so, it may be better to deploy the feature as a separate service.

ÖrnekExample

Sepet düzeni birçok senaryo için geçerlidir.The sidecar pattern is applicable to many scenarios. Sık karşılaşılan senaryo örneklerinden bazıları şunlardır:Some common examples:

  • Altyapı API’si.Infrastructure API. Altyapı geliştirme takımı, altyapıya erişim için dile özgü bir istemci kitaplığı yerine her uygulamayla birlikte dağıtılan bir hizmet oluşturur.The infrastructure development team creates a service that's deployed alongside each application, instead of a language-specific client library to access the infrastructure. Hizmet sepet olarak yüklenir ve günlüğe kaydetme, ortam verileri, yapılandırma deposu, bulma, sistem durumu denetimleri ve izleyici hizmetleri de dahil olmak üzere altyapı hizmetleri için ortak bir katman sağlar.The service is loaded as a sidecar and provides a common layer for infrastructure services, including logging, environment data, configuration store, discovery, health checks, and watchdog services. Sepet aynı zamanda üst uygulamanın ana bilgisayar ortamını ve işlemini (veya kapsayıcısını) izleyerek bilgileri merkezi bir hizmete kaydeder.The sidecar also monitors the parent application's host environment and process (or container) and logs the information to a centralized service.
  • NGINX/HAProxy yönetimi.Manage NGINX/HAProxy. NGINX’i ortam durumunu izleyen ve sonra NGINX yapılandırma dosyasını güncelleştirip, durum değişikliği gerektiğinde işlemi geri dönüştüren bir sepet hizmetiyle dağıtın.Deploy NGINX with a sidecar service that monitors environment state, then updates the NGINX configuration file and recycles the process when a change in state is needed.
  • Temsilci sepeti.Ambassador sidecar. Dağıtım bir Büyükelçi hizmet sepet olarak.Deploy an ambassador service as a sidecar. Uygulama, günlüğe istek kaydetme, yönlendirme, devre kesme ve bağlantıyla ilgili diğer özellikleri işlemesi için temsilciye çağrı yapar.The application calls through the ambassador, which handles request logging, routing, circuit breaking, and other connectivity related features.
  • Ara sunucuyu boşaltma.Offload proxy. Hizmet için statik dosya içeriği sunumunu işlemek üzere bir node.js hizmet örneğinin önüne NGINX ara sunucusu yerleştirin.Place an NGINX proxy in front of a node.js service instance, to handle serving static file content for the service.