【Kubernetes知识点】 解读 Service 和 EndpointSlice 之间的关系

news2024/9/30 22:09:22

【Kubernetes知识点】 解读 Service 和 EndpointSlice 之间的关系

目录

  • 1 概念
    • 1.1 Service的概念
    • 1.2 Endpoint 的概念
    • 1.3 EndpointSlice 的引入
      • 1.3.1 EndpointSlice支持的地址
      • 1.3.2 EndpointSlice的状态
      • 1.3.3 EndpointSlice的拓扑信息
    • 1.4 Service 、Endpoint和 EndpointSlice 的关系
    • 1.5 Endpoint 和 EndpointSlice 的对比
    • 1.6 无选择器 Service 的场景
    • 1.7 自定义EndpointSlice 要求
  • 2 实验设计:验证Service 和 EndpointSlice关联
    • 2.1 创建测试应用:
    • 2.2 观察Service和EndpointSlice
    • 2.3 模拟 Pod 变化: 扩容和缩容Pod
    • 2.4 无选择器 Service 实验:
  • 3 结论
  • 4 参考文献

❤️ 摘要:在 Kubernetes 中,Service 和 EndpointSlice 是实现负载均衡和服务发现的重要组件。 EndpointSlice让Service更好地处理大量后端,并允许集群有效地更新其健康后端列表。本文将深入探讨它们之间的关系,并设计实验来验证这一关系。


💯 本文关联好文:

  • 《一文读懂Service以及实践攻略》

1 概念

1.1 Service的概念

❔说明:想深入了解Service,请提前看前文《一文读懂Service以及实践攻略》

Kubernetes 中的 Service 是一种网络抽象层,旨在为一组 Pod 提供稳定的访问入口。通过 Service,用户可以不必关心 Pod 的变化,而是通过统一的 IP 地址和端口来访问这些 Pod。

1.2 Endpoint 的概念

Endpoints 是 Kubernetes 中用于跟踪服务网络端点的原始 API。每个 Service 都有一个对应的 Endpoints 对象,存储该服务的所有网络端点。然而,随着 Kubernetes 集群和服务的扩展,原有的 Endpoints API 逐渐暴露出其局限性,特别是在处理大量网络端点的时候。

Kubernetes 限制单个 Endpoints 对象中可以容纳的端点数量。当服务有超过 1000 个支持端点时,Kubernetes 会截断 Endpoints 对象中的数据, 并在 Endpoints 上设置注释: endpoints.kubernetes.io/over-capacity: truncated

1.3 EndpointSlice 的引入

❔ 说明: Kubernetes v1.21之后, EndpointSlice特性是stable

为了更有效地管理服务的端点,Kubernetes 引入了 EndpointSlice。与传统的 Endpoints 资源相比,EndpointSlice 提供了更好的扩展性,尤其是在处理大规模集群时。它将多个端点组织成切片,减少 API 调用次数,提高效率。

如果某个服务的端点数量达到阈值,那么 Kubernetes 将添加另一个空的 EndpointSlice 并在其中存储新的端点信息。默认情况下,一旦现有 EndpointSlice 全部包含至少 100 个端点,Kubernetes 就会创建一个新的 EndpointSlice。

1.3.1 EndpointSlice支持的地址

EndpointSlices 支持三种地址类型,设置addressType字段:

  • IPv4
  • IPv6
  • FQDN (Fully Qualified Domain Name)

❔ 说明: 每个 EndpointSlice 对象代表一个特定的IP地址类型。如果您有一项可通过 IPv4 和 IPv6 使用的服务,则至少有两个 EndpointSlice 对象。

1.3.2 EndpointSlice的状态

EndpointSlice API有三个状态条件, 说明以下:

条件说明
ready正在运行的Pod将Ready 条件设置为 True 时,同时将 EndpointSlice 条件也设置为 true。
servingserving 条件几乎与 ready 条件相同。不同之处在于,如果用户在 pod 终止时关心 pod是否还运行,则应检查 serving 条件。
TerminatingTerminating 是指示端点是否正在终止的条件。对于 Pod,这是设置了删除时间戳的任何 Pod。

1.3.3 EndpointSlice的拓扑信息

EndpointSlice 中的每个端点都可以包含相关的拓扑信息。拓扑信息包括端点的位置以及对应的Node和Zone的信息。字段说明以下:

  • nodeName - 此端点所在节点的名称。
  • zone - 此端点所在的区域。

1.4 Service 、Endpoint和 EndpointSlice 的关系

打个比喻:在一个大型活动中,K8s中的Service作为活动入口的前台人员,他为所有来宾提供入口进入指示。每个来宾Endpoint在活动中有自己的身份标识,比如知道他们的座位号。

现在这个活动区,划分了多个小区域,EndpointSlice就像是一个拿着分区名单的组长,名单记录了一组来宾的身份信息和他们的座位分布。通过EndpointSlice,你可以更高效地管理和查找来宾的位置信息,尤其是在活动人数众多时。这种分片的方式让协调工作变得更加灵活和高效。

Kubernetes中,Service与EndpointSlice实现以下机制:

  1. 选择器机制:Service 使用标签选择器来确定哪些 Pod 作为其后端。EndpointSlice 则维护与这些 Pod 相关联的网络端点信息。
  2. 动态更新:当 Pod 的状态变化时,Service 控制器会自动更新 EndpointSlice,确保服务始终指向活跃的 Pod。
  3. 负载均衡:EndpointSlice 的分组机制使得负载均衡变得更加高效,能够快速响应 Pod 的变化。

1.5 Endpoint 和 EndpointSlice 的对比

作为新的替代方案,EndpointSlice与Endpoint有以下不同点:

资源对象EndpointsEndpointSlice
数据结构所有网络端点信息存储在一个单一的 Endpoints 对象中。随着后端 Pod 数量的增加,这些对象可能会变得非常庞大。将网络端点组织为多个切片,使得每个切片只包含一部分端点信息,从而减小单个对象的大小。
性能在更新过程中,Endpoints 的每次变更都会引发大量的流量,这在高频更新的场景下尤其明显。EndpointSlices 的设计使得添加或删除单个 Pod 只需触发相同数量的更新,但更新消息的大小要小得多,从而降低了 CPU 使用率和网络流量。
新特性支持N/AEndpointSlices 支持新的网络功能,如双栈网络和拓扑感知路由,使得 Kubernetes 在网络管理上更加灵活和高效。

1.6 无选择器 Service 的场景

在某些情况下,用户可能希望定义一个没有选择器的 Service。这种情况通常用于以下场景:

  • 外部数据库:在生产环境中使用外部数据库集群,而在测试环境中使用内部数据库。
  • 跨命名空间或集群访问:需要将 Service 指向不同命名空间或其他集群中的 Service。
  • 迁移工作负载:在评估迁移至 Kubernetes 的过程中,可能只在 Kubernetes 中运行部分后端。

在这些场景中,可以定义一个不带选择器的 Service。由于没有选择器,Kubernetes 不会自动创建对应的 EndpointSlice(和旧版的 Endpoints)对象。用户可以手动添加 EndpointSlice 对象,将 Service 映射到实际运行的网络地址和端口。

1.7 自定义EndpointSlice 要求

对于用户手动创建的 EndpointSlice,建议选择合适的标签值,例如 endpointslice.kubernetes.io/managed-by。对于直接使用 kubectl 管理 EndpointSlices 的用户,建议使用描述此手动管理的名称,例如 “staff” 或 “cluster-admins”,应避免使用保留值 “controller”,因为它表示由 Kubernetes 自身控制平面管理的 EndpointSlices。

⚠️ 注意: Kubernetes API 服务器不允许代理未映射到 Pods 的端点。由于这一限制,诸如 kubectl port-forward service/<service-name> 的操作在 Service 没有选择器时会失败。

2 实验设计:验证Service 和 EndpointSlice关联

为验证 Service 和 EndpointSlice 之间的关系,我们可以进行以下实验:

2.1 创建测试应用:

沿用《一文读懂Service以及实践攻略》案例,创建一个简单的 Web 应用,定义一个 Deployment 和对应的 Service。

Deployment 示例

apiVersion: apps/v1
kind: Deployment
metadata:
# 定义Deployment的名字
  name: nginx-deployment
  labels:
    app: nginx
spec:
  # 定义副本数
  replicas: 1
  # 选择器指定label与pod模板的label匹配
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
    # 与选择器指定label匹配
      labels:
        app: nginx
    spec:
      containers:
      # pod名字,可自定义
      - name: nginx
      # 镜像源, 这里设置私有镜像源
        image: harbor.zx/hcie/nginx:1.26.1
      # pod暴露端口号
        ports:
        - containerPort: 80
          name: http
          protocol: TCP

Service 示例

---
apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

部署Service和Deployment

kubectl apply -f nginx-deployment.yaml
kubectl apply -f clusterip-service.yaml

2.2 观察Service和EndpointSlice

查看service详细信息

kubectl describe svc my-clusterip-service

输出如下:

Name:              my-clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.245.81.75
IPs:               10.245.81.75
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         172.16.194.102:80
Session Affinity:  None
Events:            <none>

查看endpointslice

kubectl describe endpointslices.discovery.k8s.io my-clusterip-service-xvl7k

输出如下:

Name:         my-clusterip-service-xvl7k
Namespace:    default
Labels:       endpointslice.kubernetes.io/managed-by=endpointslice-controller.k8s.io
# 通过label,自动关联my-clusterip-service
              kubernetes.io/service-name=my-clusterip-service
Annotations:  endpoints.kubernetes.io/last-change-trigger-time: 2024-09-28T09:43:42Z
AddressType:  IPv4
Ports:
  Name     Port  Protocol
  ----     ----  --------
  <unset>  80    TCP
# 自动关联Endpoint,对应pod
Endpoints:
  - Addresses:  172.16.194.102
  # pod状态是Ready时, EndpointSlice状态自动设置为Ready
    Conditions:
      Ready:    true
    Hostname:   <unset>
    # 关联某个Deployment下pod
    TargetRef:  Pod/nginx-deployment-64db67d8bc-zblx6
    # 描述pod在当前的节点
    NodeName:   k8s-worker1
    # 描述pod在当前的域
    Zone:       <unset>
Events:         <none>

❔ 说明:

  • 通过创建上述 Deployment 和 Service,Kubernetes 会自动生成 EndpointSlice。

2.3 模拟 Pod 变化: 扩容和缩容Pod

扩容Deployment的副本数到3,观察EndpointSlice的变化:

kubectl scale deployment/nginx-deployment --replicas=3

观察Endpointslice,执行以下命令

kubectl describe endpointslices.discovery.k8s.io my-clusterip-service-xvl7k

输出如下:

erip-service-xvl7k
Name:         my-clusterip-service-xvl7k
Namespace:    default
Labels:       endpointslice.kubernetes.io/managed-by=endpointslice-controller.k8s.io
              kubernetes.io/service-name=my-clusterip-service
Annotations:  endpoints.kubernetes.io/last-change-trigger-time: 2024-09-28T09:57:26Z
AddressType:  IPv4
Ports:
  Name     Port  Protocol
  ----     ----  --------
  <unset>  80    TCP
# 新增两个Endpoint,并分配到不同的节点
Endpoints:
  - Addresses:  172.16.194.102
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-zblx6
    NodeName:   k8s-worker1
    Zone:       <unset>
  - Addresses:  172.16.135.200
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-qbmvd
    NodeName:   k8s-master3
    Zone:       <unset>
  - Addresses:  172.16.126.43
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-p7xqj
    NodeName:   k8s-worker2
    Zone:       <unset>
Events:         <none>

手动删除一个 Pod,并观察 EndpointSlice 的变化:

kubectl delete pod nginx-deployment-64db67d8bc-zblx6 

观察Endpointslice,执行以下命令

kubectl describe endpointslices.discovery.k8s.io my-clusterip-service-xvl7k

输出如下:

# Endpoint列表会剔除被删除的pod
Endpoints:
  - Addresses:  172.16.135.200
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-qbmvd
    NodeName:   k8s-master3
    Zone:       <unset>
  - Addresses:  172.16.126.43
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-p7xqj
    NodeName:   k8s-worker2
    Zone:       <unset>
Events:         <none>
---
Endpoints:
  - Addresses:  172.16.135.200
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-qbmvd
    NodeName:   k8s-master3
    Zone:       <unset>
  - Addresses:  172.16.126.43
    Conditions:
      Ready:    true
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-p7xqj
    NodeName:   k8s-worker2
    Zone:       <unset>
  - Addresses:  172.16.194.101
    Conditions:
      Ready:    false                                   -> Ready状态从false转为true 
    Hostname:   <unset>
    TargetRef:  Pod/nginx-deployment-64db67d8bc-v86vr   -> 添加新的pod 
    NodeName:   k8s-worker1
    Zone:       <unset>
Events:         <none>


❔步骤说明:

  1. EndpointSlice监听到Pod被删除的事件;
  2. 更新Endpoint列表,剔除被删除的Pod;
  3. EndpointSlice监听到新的Pod被创建;
  4. 更新Endpoint列表,新增新创建的Pod;
  5. 监听Pod的状态,如果Pod状态转为Ready, 则设置Endpoint的状态为Ready。

❔ 总结:

  1. 动态更新:当 Pod 的状态变化时,Service 控制器会自动更新 EndpointSlice,确保服务始终指向活跃的 Pod。
  2. 负载均衡:EndpointSlice 的分组机制使得负载均衡变得更加高效,能够快速响应 Pod 的变化。

2.4 无选择器 Service 实验:

如果是Service需要代理外部的应用,或者应用的部署在Service之后的, 可能会采用无选择器的Service这种方式部署Service资源。

创建一个不带选择器的 Service:

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  ports:
    - port: 8080
      targetPort: 8080

然后手动创建 EndpointSlice:

apiVersion: discovery.k8s.io/v1
addressType: IPv4
endpoints:
# 外部应用的IP地址
  - addresses:
      - 192.168.1.100
    conditions:
      ready: true
kind: EndpointSlice
metadata:
  labels:
    endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.io
    # 关联没有选择器的service
    kubernetes.io/service-name: external-service
  name: external-service-endpoints
  namespace: default
# 指定映射的端口
ports:
- name: ""
  port: 8080
  protocol: TCP


创建service和endpointslice

kubectl apply -f external-service.yaml
kubectl apply -f external-service-endpoints.yaml

观察service状态

[root@k8s-master1 hcie]# kubectl describe svc external-service
Name:              external-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
# 确实没有selector
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.245.23.244
IPs:               10.245.23.244
Port:              <unset>  8080/TCP
TargetPort:        8080/TCP
# 没有Endpoint
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

观察Endpointslice状态

[root@k8s-master1 hcie]# kubectl describe endpointslices.discovery.k8s.io external-service-endpoints
Name:         external-service-endpoints
Namespace:    default
Labels:       endpointslice.kubernetes.io/managed-by=endpointslice-controller.k8s.io
              kubernetes.io/service-name=external-service
Annotations:  <none>
AddressType:  IPv4
Ports:
  Name     Port  Protocol
  ----     ----  --------
  <unset>  8080  TCP
Endpoints:
  - Addresses:  192.168.1.100
    Conditions:
      Ready:   true
    Hostname:  <unset>
    NodeName:  <unset>
    Zone:      <unset>
Events:        <none>

成功创建并关联。

3 结论

通过以上实验,我们可以验证 Service 和 EndpointSlice 之间的密切关系。EndpointSlices 的引入解决了原有 Endpoints 的性能瓶颈,使 Kubernetes 在网络管理上更加高效和灵活。在实验中,验证了Service 通过标签选择器关联 Pod,而 EndpointSlice 则负责维护这些 Pod 的网络信息。无选择器的 Service 也能够与外部后端进行整合,提供更大的灵活性。希望本文可以帮助你更深入了解它们间的关系。

4 参考文献

[1]Kubernetes 官方文档-service

[2]EndpointSlices

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Beyond Compare 比较CRC值、二进制比较、关联规则比较,有何区别?(CRC比较、CRC值比较)

文章目录 Beyond Compare文件比较方法深入分析CRC值比较定义及工作原理应用场景优点和缺点 二进制比较定义及工作原理应用场景优点和缺点 关联规则比较定义及工作原理应用场景优点和缺点 比较示例 性能差异CRC值比较的性能影响优点缺点 二进制比较的性能影响优点缺点 关联规则比…

C项目--带权限的图书管理系统(1000多行代码,代码数据可下载,极其适合初学练手)

本专栏目的 更新C/C的相关的项目 前言 C语言的图书权限管理系统完结(进阶的一点后面更新)&#xff0c;1000多行代码(核心代码5、600行&#xff09;&#xff1b;本设计是一个比较综合的练习&#xff0c;用到数据结构&#xff08;顺序表、链表、静态链表&#xff09;、文件、排…

发布-订阅模式演示示例

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>发布-订阅模式示例</title><styl…

LC记录一:寻找旋转数组最小值、判断旋转数组是否存在给定元素

文章目录 33.搜索旋转排序数组81.搜索旋转排序数组||153.寻找旋转排序数组中的最小值154.寻找旋转排序数组中的最小值||参考链接 33.搜索旋转排序数组 https://leetcode.cn/problems/search-in-rotated-sorted-array/description/ 下面这张图片是LC154题官方题解提供的一个图…

重磅!25年3月起,PMP®考试将启用新教材!

近期&#xff0c;PMI对各科目教材进行了调整。9月27日宣布了2025年3月将会更新ACP的考试内容&#xff0c;新版考试仍将围绕敏捷思维和产品交付&#xff0c;但考试内容大纲(ECO)将整合为四大领域&#xff08;思维、领导力、产品、交付&#xff09;&#xff0c;融合现代新的项目类…

DAY18||530.二叉搜索树的最小绝对值差 |501.二叉搜索树中的众数| 236.二叉树的最近公共祖先

530.二叉搜索树的最小绝对值差 题目&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 …

MongoDB 快速入门+单机部署(附带脚本)

目录 介绍 体系结构 数据模型 BSON BSON 数据类型 特点 高性能 高可用 高扩展 丰富的查询支持 其他特点 部署 单机部署 普通安装 脚本安装 Docker Compose 安装 卸载 停止 MongoDB 删除包 删除数据目录 参考&#xff1a; https://docs.mongoing.com/ 介绍…

Ping到底干了啥?ICMP 协议详解

什么是 ICMP&#xff1f; ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#xff09;是一种网络层协议&#xff0c;主要用于在网络设备之间传递控制信息和错误消息。它是 IP 协议族的一部分&#xff0c;通常与 IP 协议一起使用。ICMP 的主…

cheese自动化平台开发环境搭建【图文版】

目的 cheese自动化平台是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。可以采用Vscode、IDEA编写&#xff0c;支持Java、Python、nodejs、GO、Rust、Lua。官方提供了视频版教程&#xff0c;对于…

leetcode每日一题day20(24.9.30)——座位预约管理系统

思路&#xff1a;由于一直是出最小的编号&#xff0c;并且除此之外只有添加元素的操作&#xff0c;如果使用数组存储&#xff0c;并记录&#xff0c;这样出最小编号时间是O(n)复杂度,释放一个座位则是O(1)在操作出线机会均等的情况下&#xff0c;平均是O(n/2), 但对于这种重复 …

CANoe_trace介绍以及如何使用C#仿制trace方案介绍

C#UI界面仿制trace界面介绍--初次制作&#xff0c;后续待完善 在汽车电子开发中&#xff0c;DBC&#xff08;Database Container&#xff09;文件对于定义和描述CAN&#xff08;Controller Area Network&#xff09;通信协议至关重要。随着项目的迭代和功能的扩展&#xff0c;手…

Elasticsearch 开放推理 API 增加了对 Google AI Studio 的支持

作者&#xff1a;来自 Elastic Jeff Vestal 我们很高兴地宣布 Elasticsearch 的开放推理 API 支持 Gemini 开发者 API。使用 Google AI Studio 时&#xff0c;开发者现在可以与 Elasticsearch 索引中的数据进行聊天、运行实验并使用 Google Cloud 的模型&#xff08;例如 Gemin…

0基础学前端 day7

大家好&#xff0c;欢迎来到无限大的频道 今天继续带领大家来了解前端的知识&#xff0c;深入了解互联网和浏览器背后的技术。 历史背景 互联网的起源可以追溯到20世纪60年代的ARPANET项目&#xff0c;作为研究机构之间的通信网络。最初的网页浏览器由Tim Berners-Lee于1990…

【工程测试技术】第3章 测试装置的基本特性,静态特性和动态特性,一阶二阶系统的特性,负载效应,抗干扰性

目录 3.1 概述 1测量装置的静态特性 2.标准和标准传递 3.测量装置的动态特性 4.测量装置的负载特性 5.测量装置的抗干扰性 1.线性度 2.灵敏度 3.回程误差 4.分辨力 5.零点漂移和灵敏度漂移 3.3.1 动态特性的数学描述 1.传递函数 2.频率响应函数 3.脉冲响应函数 …

jmeter进行性能测试实践

设置场景接口 一、通过抓取一个场景的接口&#xff08;抓包&#xff09; 自己抓取需要的接口&#xff0c;进行依赖 流程&#xff1a;1.在网页上F12抓取登录页面和登出页面的URL。2.在jemeter设置线程组&#xff0c;添加http请求输入URL等。3.查看结果数 二、通过boday录制 …

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-29

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-29 在这一期中&#xff0c;我们对大语言模型在软件开发中的跨学科应用的几个工作做简要的介绍。相关内容涵盖软件测试时的问题报告&#xff0c;问题分类&#xff0c;测试生成&#xff0c;和软件测试中的AI应用: …

【宝藏篇】加密软件有哪些?10款好用的加密软件推荐!

小明&#xff1a;嘿&#xff0c;小华&#xff0c;你知道有哪些好用的加密软件吗&#xff1f;我最近需要保护一些敏感数据。 小华&#xff1a;当然&#xff0c;小明&#xff01;现在市场上有很多优秀的加密软件&#xff0c;可以帮助你保护数据安全。我正好有10款宝藏级的加密软件…

【RocketMQ】RocketMQ应用难点

&#x1f3af; 导读&#xff1a;本文探讨了RocketMQ中消息重复消费的问题及其解决方案&#xff0c;尤其是在CLUSTERING模式下的扩容影响。文章分析了重复消费的原因&#xff0c;如广播模式、负载均衡模式下的多consumerGroup消费、消费者组内的动态变化及网络延迟等&#xff0c…

基于单片机的催眠电路控制系统

** 文章目录 前言一 概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主…

动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络

3.1 线性回归 线性回归是对n维输入的加权&#xff0c;外加偏差 线性回归可以看作是单层神经网络 回归问题中最常用的损失函数是平方误差函数。 平方误差可以定义为以下公式&#xff1a; 常数1/2不会带来本质的差别&#xff0c;但这样在形式上稍微简单一些 &#xff08;因为当…