前言
在Kubernetes中,随着微服务数量的增加,连接和维护微服务的难度和复杂性呈指数级增长。消息传递可以为该问题提供一个解决方案。
在本文中,我将分享Kubernetes中消息传递的好处以及传统方式的消息队列可能带来的困难。我还将简要介绍一下KubeMQ,它试图解决Kubernetes中消息传递的一些传统问题。
为什么要在Kubernetes中进行消息传递?
随着微服务的发展,可能很难连接这些分布式服务中的每一个。每次点对点交互都必须解决安全性,可用性和延迟问题。此外,随着服务数量的增加,潜在连接的数量也会增加。例如,考虑一个只有三个服务的环境。这三个服务总共具有三个潜在连接:
但是,随着增加到说五个服务,潜在的连接数增加到10:
提供20项服务,潜在的连接数为190!供参考,请参见下表:
服务数量 | 3 | 5 | 20 | ñ |
---|---|---|---|---|
连接数 | 3 | 10 | 190 | n(n-1)/ 2 |
对于拥有大量微服务的组织来说,这显然是不可持续的。但是,通过使用消息队列,我们可以集中管理这些连接。由于连接数等于服务数,因此这就有了如下的线性扩展的解决方案。
对于大型微服务集群,如果每个微服务都与消息队列进行通信,就会极大地提高服务的安全性和可用性。这就是在Kubernetes中运行大量微服务时,选择消息队被认为是最佳实践的原因。因此,消息队列的选择是至关重要的决定,因为集群的稳定将取决于该消息队列的可靠性和可伸缩性。
Kubernetes中的消息传递有什么困难?
尝试在Kubernetes中运行消息队列时有很多痛苦点。让我们考虑一下典型的微服务和传统的消息队列之间的区别。我总结了一些区别:
典型的微服务 | 传统的消息队列 |
---|---|
资源轻 | 资源密集 |
无状态 | 有状态的 |
部署简单 | 复杂的部署 |
水平可扩展 | 垂直可扩展 |
首先,微服务被设计为对资源需求较少的。因为每个微服务执行一个单一的目的,因此可以变得更小,更灵活。相反,传统的消息队列是大型的资源密集型应用程序。在撰写本文时,IBM MQ的最新版本硬件要求需要大于1.5 GB磁盘空间和3 GB 内存空间。
另外,典型的微服务是无状态的,因为它本身不包含应用程序状态的任何部分。但是,许多传统的消息队列可以有效地用作数据库,并且需要持久存储。
资源使用上的这些差异自然会导致下一个问题-部署。微服务易于部署,他旨在快速部署并作为集群的一部分。另一方面,由于传统的消息队列具有资源密集型的性质,因此它们具有复杂的部署指令,需要专门的团队来配置和维护。
接下来,微服务被设计为可水平扩展。水平扩展是通过部署服务的其他实例来完成的。这使服务几乎可以无限扩展,具有高可用性并且部署成本不高。相反,由于上述资源需求和部署难题,传统的消息队列必须垂直扩展,换句话说,是一台更大的机器。除了物理限制(一台机器只能如此强大)之外,大型机器也很昂贵。
这些问题通常需要大量的投资和时间来解决,从而降低了消息队列为你的kubernetes提供的价值。但是,这些问题都不是消息传递固有的。相反,它们只是传统消息队列设计和构思时的产物。
那么我们如何解决这些问题呢?使用KubeMQ。
KubeMQ
KubeMQ试图解决与Kubernetes相关的消息传递问题。让我们看一下它的几种实现方式。
首先,它是Kubernetes-native,这意味着它可以与Kubernetes很好地集成,并且易于部署。用于生命周期管理的的 operator可让你自动执行Kubernetes本身无法提供的任务,支持本地存储卷和PVC。Kubernetes原生也意味着它与云无关,因此它也可以部署在本地或混合云环境中。
此外,它是轻量级的-Docker容器约为30 MB,与传统解决方案所需的GB空间相去甚远。这使得它几乎可以部署在任何地方,并可以启用新的用例,例如物联网设备支持的边缘部署。尽管很小,但它支持 各种消息传递模式。
最后,它是可扩展的。通过使用 Bridges, Targets和 Sources,这些预构建的连接器使其可以连接到其他各种应用程序和服务,从而减少了对自定义集成的需求。网桥允许KubeMQ群集之间相互传递消息,从而使KubeMQ可以连接各种云,内部部署和边缘环境。
由于KubeMQ很小,因此你可以在 本地安装minikube进行尝试,也可以访问任何其他Kubernetes集群。
你可以使用kubectl get kubemqclusters -n kubemq验证集群的状态。
有关更多信息,请查看 官方文档。
概括
在本文中,我回顾了消息队列的好处,研究了在Kubernetes中消息传递的困难,并快速了解了KubeMQ ,这是一种轻量级的Kubernetes原生解决方案,可以提供比传统解决方案更多的优势。
译文链接: https://dzone.com/articles/microservice-messaging-in-kubernetes