dockerizing Java Springboot 应用程序的优点?
Advantages of dockerizing Java Springboot application?
我们正在使用 dockerized kafka 环境。我想知道在这种情况下部署 kafka-connectors 和 kafka-streams 应用程序的最佳实践。目前我们正在将每个连接器和流部署为 springboot 应用程序,并作为 systemctl 微服务启动。我没有发现对每个 kafka connector 和 stream 进行 dockerizing 的显着优势。请提供相同的见解
Dockerizing + kubernetes 集群提供了许多好处,如自动修复、自动水平缩放。
自动修复:如果 spring 应用程序崩溃,kubernetes 将自动 运行 另一个实例,并确保所需数量的容器始终处于运行状态。
自动水平缩放:如果收到大量消息,您可以调整 spring 应用程序以使用 HPA[= 自动向上或向下缩放21=] 也可以使用自定义指标。
对我来说 Docker vs non-Docker 归结为 "what does your operations team or organization support?"
Docker 化应用程序的优势在于它们的外观/行为都相同:您 docker run
一个 Java 应用程序与您 docker run
一个 Ruby 应用程序。与使用 systemd 的 运行ning 程序的方法不同,"how do I run this thing?"
通常没有通用的抽象层
Docker 化的应用程序也可能抽象出一些小的操作细节,例如端口管理 - 即确保您的所有应用程序的 management.port
不会相互冲突。 Docker 容器中的应用程序将 运行 作为容器内的一个端口,您可以 expose
该端口作为容器外的其他端口。 (随机或您选择一个)。
根据基础架构支持,正常的 Docker 调度程序可能会 auto-scale 服务达到一定容量时的服务。但是,在 Kafka 流应用程序中,并发性受到 Kafka 主题中分区数量的限制,因此扩大规模只会意味着您的消费者组中的一些消费者闲置(如果超过分区数量)。
但它也增加了复杂性:如果您使用 RocksDB 作为您的本地存储,您可能希望将其保留在(一次性的,并且可能是只读的!)容器之外。因此,您需要弄清楚如何在操作上/组织上执行卷持久性。使用带 Systemd 的普通 ol' Jars...好吧,你总是有硬盘驱动器,如果服务器崩溃,它会重新启动(物理机)或者希望它会被一些实例块存储东西恢复。
我的意思是说:kstream 应用程序不是无状态的,网络应用程序 auto-scaling 将始终为您提供更多功能,并且服务于 HTTP 流量。在组织或运营层面做出这些决定的人可能并不完全了解这一点。再一次,嘿,如果每个人都写 Docker 东西,那么组织/运营团队 "just" 有一些 Docker 调度程序集群(如 Kubernetes 集群或 Amazon ECS 集群)需要管理,并且不要不必再直接管理 VM。
我们正在使用 dockerized kafka 环境。我想知道在这种情况下部署 kafka-connectors 和 kafka-streams 应用程序的最佳实践。目前我们正在将每个连接器和流部署为 springboot 应用程序,并作为 systemctl 微服务启动。我没有发现对每个 kafka connector 和 stream 进行 dockerizing 的显着优势。请提供相同的见解
Dockerizing + kubernetes 集群提供了许多好处,如自动修复、自动水平缩放。
自动修复:如果 spring 应用程序崩溃,kubernetes 将自动 运行 另一个实例,并确保所需数量的容器始终处于运行状态。
自动水平缩放:如果收到大量消息,您可以调整 spring 应用程序以使用 HPA[= 自动向上或向下缩放21=] 也可以使用自定义指标。
对我来说 Docker vs non-Docker 归结为 "what does your operations team or organization support?"
Docker 化应用程序的优势在于它们的外观/行为都相同:您 docker run
一个 Java 应用程序与您 docker run
一个 Ruby 应用程序。与使用 systemd 的 运行ning 程序的方法不同,"how do I run this thing?"
Docker 化的应用程序也可能抽象出一些小的操作细节,例如端口管理 - 即确保您的所有应用程序的 management.port
不会相互冲突。 Docker 容器中的应用程序将 运行 作为容器内的一个端口,您可以 expose
该端口作为容器外的其他端口。 (随机或您选择一个)。
根据基础架构支持,正常的 Docker 调度程序可能会 auto-scale 服务达到一定容量时的服务。但是,在 Kafka 流应用程序中,并发性受到 Kafka 主题中分区数量的限制,因此扩大规模只会意味着您的消费者组中的一些消费者闲置(如果超过分区数量)。
但它也增加了复杂性:如果您使用 RocksDB 作为您的本地存储,您可能希望将其保留在(一次性的,并且可能是只读的!)容器之外。因此,您需要弄清楚如何在操作上/组织上执行卷持久性。使用带 Systemd 的普通 ol' Jars...好吧,你总是有硬盘驱动器,如果服务器崩溃,它会重新启动(物理机)或者希望它会被一些实例块存储东西恢复。
我的意思是说:kstream 应用程序不是无状态的,网络应用程序 auto-scaling 将始终为您提供更多功能,并且服务于 HTTP 流量。在组织或运营层面做出这些决定的人可能并不完全了解这一点。再一次,嘿,如果每个人都写 Docker 东西,那么组织/运营团队 "just" 有一些 Docker 调度程序集群(如 Kubernetes 集群或 Amazon ECS 集群)需要管理,并且不要不必再直接管理 VM。