全链路灰度之 RocketMQ 灰度

简介:本文将以上次介绍过的《如何用 20 分钟就能获得同款企业级全链路灰度能力?》中的场景为基础,来进一步介绍消息场景的全链路灰度。

作者:亦盏

之前的系列文章中,我们已经通过全链路金丝雀发布这个功能来介绍了 MSE 对于全链路流量控制的场景,我们已经了解了 Spring Cloud 和 Dubbo 这一类 RPC 调用的全链路灰度应该如何实现,但是没有涉及到消息这类异步场景下的流量控制,今天我们将以上次介绍过的《如何用 20 分钟就能获得同款企业级全链路灰度能力?》中的场景为基础,来进一步介绍消息场景的全链路灰度。

虽然绝大多数业务场景下对于消息的灰度的要求并不像 RPC 的要求得这么严格,但是在以下两个场景下,还是会对消息的全链路有一定的诉求的。

1、第一种场景是在消息消费时,可能会产生新的 RPC 调用,如果没有在消息这一环去遵循之前设定好的全链路流量控制的规则,会导致通过消息产生的这部分流量“逃逸”,从而导致全链路灰度的规则遭到破坏,导致出现不符合预期的情况。

为了防止出现这个情况,我们需要在消费时候将消息里原来的流量标复原,并在 RPC 调用的时候遵循原来的规则。我们通过架构图来详细描述一下,满足这个逻辑之后,调用链路是怎样的,从下图中我们可以看到,灰度和基线环境生产出来的消息,虽然在消息推送的时候是随机的,但是在消费过程中,产生的新的 RPC 调用,还是能够回到流量原来所属的环境。

2、第二种场景需要更加严格的消息灰度隔离。比如当消息的消费逻辑进行了修改时,这时候希望通过小流量的方式来验证新的消息消费逻辑的正确性,要严格地要求灰度的消息只能被推送给灰度的消息消费者。

今天我们就来实操一下第二种场景消息的全链路灰度,目前 MSE 仅支持 RocketMQ 消息的灰度。若您使用的是开源版 RocketMQ,那么版本需要在 4.5.0 及以上,若您使用的是阿里云商业版 RocketMQ,那么需要使用铂金版,且 Ons Client 版本在 1.8.0.Final 及以上。如果只是想使用第一种场景,只需要给 B 应用开启全链路灰度的功能即可,不需要做额外的消息灰度相关的配置。

在这次最佳实践的操作中,我们是将应用部署在阿里云容器服务 Kubernetes 版本,即 ACK 集群来演示,但是事实上,消息灰度对于应用的部署模式是没有限制性要求的,您可以参考 MSE 帮助文档,找到自己所使用的部署模式对应的接入方式,也能使用消息全链路灰度。

前提条件

  1. 开通 MSE 专业版,请参见开通 MSE 微服务治理专业版[1]
  2. 创建 ACK 集群,请参见创建 Kubernetes 集群[2]

操作步骤

步骤一:接入 MSE 微服务治理

1、安装 mse-ack-pilot

  1. 登录容器服务控制台[3]
  2. 在左侧导航栏单击市场 > 应用目录
  3. 在应用目录页面点击阿里云应用,选择微服务,并单击 ack-mse-pilot
  4. 在 ack-mse-pilot 页面右侧集群列表中选择集群,然后单击创建。

安装 MSE 微服务治理组件大约需要 2 分钟,请耐心等待。

创建成功后,会自动跳转到目标集群的 Helm 页面,检查安装结果。如果出现以下页面,展示相关资源,则说明安装成功。

2、为 ACK 命名空间中的应用开启 MSE 微服务治理

  1. 登录 MSE 治理中心控制台[4],如果您尚未开通 MSE 微服务治理,请根据提示开通。
  2. 在左侧导航栏选择微服务治理中心 > Kubernetes 集群列表
  3. 在 Kubernetes 集群列表页面搜索框列表中选择集群名称或集群 ID,然后输入相应的关键字,单击搜索图标。
  4. 单击目标集群操作列的管理
  5. 在集群详情页面命名空间列表区域,单击目标命名空间操作列下的开启微服务治理
  6. 在开启微服务治理对话框中单击确认。

步骤二:还原线上场景

首先,我们将分别部署  spring-cloud-zuul、spring-cloud-a、spring-cloud-b、spring-cloud-c 这四个业务应用,以及注册中心 Nacos Server 和消息服务 RocketMQ Server,模拟出一个真实的调用链路。

Demo 应用的结构图下图,应用之间的调用,既包含了 Spring Cloud 的调用,也包含了 Dubbo 的调用,覆盖了当前市面上最常用的两种微服务框架。其中 C 应用会生产出 RocketMQ 消息,由 A 应用进行消费,A 在消费消息时,也会发起新的调用。这些应用都是最简单的 Spring Cloud 、 Dubbo 和 RocketMQ 的标准用法,您也可以直接在 https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo 项目上查看源码。

部署之前,简单介绍一下这个调用链路

spring-cloud-zuul 应用在收到 “/A/dubbo” 的请求时,会把请求转发给 spring-cloud-a ,然后 spring-cloud-a 通过 dubbo 协议去访问 spring-cloud-b, spring-cloud-b 也通过 dubbo 协议去访问 spring-cloud-c,spring-cloud-c 在收到请求后,会生产一个消息,并返回自己的环境标签和 ip。这些生产出来的消息会由 spring-cloud-a 应用消费,spring-cloud-a 应用在消费消息的时候,会通过 spring cloud 去调用 B,B 进而通过 spring cloud 去调用 C,并且将结果输出到自己的日志中。

当我们调用 /A/dubbo 的时候
返回值是这样 A[10.25.0.32] -> B[10.25.0.152] -> C[10.25.0.30]同时,A 应用在接收到消息之后,输出的日志如下2021-12-28 10:58:50.301  INFO 1 --- [essageThread_15] c.a.mse.demo.service.MqConsumer          : topic:TEST_MQ,producer:C[10.25.0.30],invoke result:A[10.25.0.32] -> B[10.25.0.152] -> C[10.25.0.30]

熟悉了调用链路之后,我们继续部署应用,您可以使用 kubectl 或者直接使用 ACK 控制台来部署应用。部署所使用的 yaml 文件如下,您同样可以直接在 https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo 上获取对应的源码。

# 部署 Nacos ServerapiVersion: apps/v1
kind: Deployment
metadata:name: nacos-server
spec:selector:matchLabels:app: nacos-servertemplate:metadata:annotations:labels:app: nacos-serverspec:containers:- env:- name: MODEvalue: "standalone"image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latestimagePullPolicy: IfNotPresentname: nacos-serverports:- containerPort: 8848---
apiVersion: v1
kind: Service
metadata:name: nacos-server
spec:type: ClusterIPselector:app: nacos-serverports:- name: httpport: 8848targetPort: 8848# 部署业务应用
---
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-zuul
spec:selector:matchLabels:app: spring-cloud-zuultemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-zuullabels:app: spring-cloud-zuulspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jre- name: enable.mq.invokevalue: 'true'image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.0imagePullPolicy: Alwaysname: spring-cloud-zuulports:- containerPort: 20000---
apiVersion: v1
kind: Service
metadata:annotations:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.smallservice.beta.kubernetes.io/alicloud-loadbalancer-address-type: internetname: zuul-slb
spec:ports:- port: 80protocol: TCPtargetPort: 20000selector:app: spring-cloud-zuultype: LoadBalancer
status:loadBalancer: {}---
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-a
spec:selector:matchLabels:app: spring-cloud-atemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-alabels:app: spring-cloud-aspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0imagePullPolicy: Alwaysname: spring-cloud-aports:- containerPort: 20001livenessProbe:tcpSocket:port: 20001initialDelaySeconds: 10periodSeconds: 30---
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-b
spec:selector:matchLabels:app: spring-cloud-btemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-blabels:app: spring-cloud-bspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0imagePullPolicy: Alwaysname: spring-cloud-bports:- containerPort: 20002livenessProbe:tcpSocket:port: 20002initialDelaySeconds: 10periodSeconds: 30---
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-c
spec:selector:matchLabels:app: spring-cloud-ctemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-clabels:app: spring-cloud-cspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0imagePullPolicy: Alwaysname: spring-cloud-cports:- containerPort: 20003livenessProbe:tcpSocket:port: 20003initialDelaySeconds: 10periodSeconds: 30
---apiVersion: apps/v1
kind: Deployment
metadata:name: rockectmq-broker
spec:selector:matchLabels:app: rockectmq-brokertemplate:metadata:labels:app: rockectmq-brokerspec:containers:- command:- sh- mqbroker- '-n'- 'mqnamesrv:9876'- '-c /home/rocketmq/rocketmq-4.5.0/conf/broker.conf'env:- name: ROCKETMQ_HOMEvalue: /home/rocketmq/rocketmq-4.5.0image: registry.cn-shanghai.aliyuncs.com/yizhan/rocketmq:4.5.0imagePullPolicy: Alwaysname: rockectmq-brokerports:- containerPort: 9876protocol: TCP- containerPort: 10911protocol: TCP- containerPort: 10912protocol: TCP- containerPort: 10909---apiVersion: apps/v1
kind: Deployment
metadata:name: rocketmq-name-server
spec:selector:matchLabels:app: rocketmq-name-servertemplate:metadata:labels:app: rocketmq-name-serverspec:containers:- command:- sh- mqnamesrvenv:- name: ROCKETMQ_HOMEvalue: /home/rocketmq/rocketmq-4.5.0image: registry.cn-shanghai.aliyuncs.com/yizhan/rocketmq:4.5.0imagePullPolicy: Alwaysname: rocketmq-name-serverports:- containerPort: 9876protocol: TCP- containerPort: 10911protocol: TCP- containerPort: 10912protocol: TCP- containerPort: 10909protocol: TCP---  apiVersion: v1
kind: Service
metadata:name: mqnamesrv
spec:type: ClusterIPselector:app: rocketmq-name-serverports:- name: mqnamesrv-9876-9876port: 9876targetPort: 9876

安装成功后,示例如下:

➜  ~ kubectl get svc,deploy
NAME                   TYPE           CLUSTER-IP        EXTERNAL-IP    PORT(S)        AGE
service/kubernetes     ClusterIP      192.168.0.1       <none>         443/TCP        7d
service/mqnamesrv      ClusterIP      192.168.213.38    <none>         9876/TCP       47h
service/nacos-server   ClusterIP      192.168.24.189    <none>         8848/TCP       47h
service/zuul-slb       LoadBalancer   192.168.189.111   123.56.253.4   80:30260/TCP   47hNAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nacos-server           1/1     1            1           4m
deployment.apps/rockectmq-broker       1/1     1            1           4m
deployment.apps/rocketmq-name-server   1/1     1            1           5m
deployment.apps/spring-cloud-a         1/1     1            1           5m
deployment.apps/spring-cloud-b         1/1     1            1           5m
deployment.apps/spring-cloud-c         1/1     1            1           5m
deployment.apps/spring-cloud-zuul      1/1     1            1           5m

同时这里我们可以通过 zuul-slb 来验证一下刚才所说的调用链路

➜  ~ curl http://123.56.253.4/A/dubbo
A[10.25.0.32] -> B[10.25.0.152] -> C[10.25.0.30]

步骤三:开启消息灰度功能

现在根据控制台的提示,在消息的生产者 spring-cloud-c 和消息的消费者 spring-cloud-a 都开启消息的灰度。我们直接通过 MSE 的控制台开启,点击进入应用的详情页,选择“消息灰度”标签。

可以看到,在未打标环境忽略的标签中,我们输入了 gray,这里意味着,带着 gray 环境标的消息,只能由 spring-cloud-a-gray 消费,不能由 spring-cloud-a 来消费。

1、这里需要额外说明一下,因为考虑到实际场景中,spring-cloud-c 应用和 spring-cloud-a  应用的所有者可能不是同一个人,不一定能够做到两者同时进行灰度发布同步的操作,所以在消息的灰度中,未打标环境默认的行为是消费所有消息。这样 spring-cloud-c 在进行灰度发布的时候,可以不需要强制 spring-cloud-a 应用也一定要同时灰度发布。

2、我们把未打标环境消费行为的选择权交给 spring-cloud-a 的所有者,如果需要实现未打标环境不消费 c-gray 生产出来的消息,只需要在控制台进行配置即可,配置之后实时生效。

  • 使用此功能您无需修改应用的代码和配置。
  • 消息的生产者和消息的消费者,需要同时开启消息灰度,消息的灰度功能才能生效。
  • 消息类型目前只支持 RocketMQ,包含开源版本和阿里云商业版。
  • 如果您使用开源 RocketMQ,则 RocketMQ Server 和 RocketMQ Client 都需要使用 4.5.0 及以上版本。
  • 如果您使用阿里云 RocketMQ,需要使用铂金版,且 Ons Client 使用 1.8.0.Final 及以上版本。
  • 开启消息灰度后,MSE 会修改消息的 Consumer Group。例如原来的 Consumer Group 为 group1,环境标签为 gray,开启消息灰度后,则 group 会被修改成 group1_gray,如果您使用的是阿里云 RocketMQ ,请提前创建好 group。
  • 默认使用 SQL92 的过滤方式,如果您使用的开源 RocketMQ,需要在服务端开启此功能(即在 broker.conf 中配置 enablePropertyFilter=true)。
  • 默认情况下,未打标节点将消费所有环境的消息,若需要指定 未打标环节点 不消费 某个标签环境生产出来的消息,请配置“未打标环境忽略的标签”,修改此配置后动态生效,无需重启应用。

步骤四:重启节点,部署新版本应用,并引入流量进行验证

首先,因为开启和关闭应用的消息灰度功能后都需要重启节点才能生效,所以首先我们需要重启一下 spring-cloud-a 和 spring-cloud-c 应用,重启的方式可以在控制台上选择重新部署,或者直接使用 kubectl 命令删除现有的 pod。

然后,继续使用 yaml 文件的方式在 Kubernetes 集群中部署新版本的 spring-cloud-a-gray、spring-cloud-b-gray 和 spring-cloud-c-gray

apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-a-gray
spec:selector:matchLabels:app: spring-cloud-a-graytemplate:metadata:annotations:alicloud.service.tag: graymsePilotCreateAppName: spring-cloud-alabels:app: spring-cloud-a-grayspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0imagePullPolicy: Alwaysname: spring-cloud-a-grayports:- containerPort: 20001livenessProbe:tcpSocket:port: 20001initialDelaySeconds: 10periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-b-gray
spec:selector:matchLabels:app: spring-cloud-b-graytemplate:metadata:annotations:alicloud.service.tag: graymsePilotCreateAppName: spring-cloud-blabels:app: spring-cloud-b-grayspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0imagePullPolicy: Alwaysname: spring-cloud-b-grayports:- containerPort: 20002livenessProbe:tcpSocket:port: 20002initialDelaySeconds: 10periodSeconds: 30---apiVersion: apps/v1
kind: Deployment
metadata:name: spring-cloud-c-gray
spec:selector:matchLabels:app: spring-cloud-c-graytemplate:metadata:annotations:alicloud.service.tag: graymsePilotCreateAppName: spring-cloud-clabels:app: spring-cloud-c-grayspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0imagePullPolicy: Alwaysname: spring-cloud-c-grayports:- containerPort: 20003livenessProbe:tcpSocket:port: 20003initialDelaySeconds: 10periodSeconds: 30

部署完成之后,我们引入流量,并进行验证

  1. 登录 MSE 治理中心控制台[4],选择应用列表
  2. 单击应用 spring-cloud-a 应用详情菜单,此时可以看到,所有的流量请求都是去往 spring-cloud-a 应用未打标的版本,即稳定版本。

  1. 点击页面下方的 标签路由中的添加按钮,为 spring-cloud-a 应用的 gray 版本设置灰度规则。
  2. 发起流量调用,我们通过 zuul-slb,分别发起流量调用,并查看灰度的情况。

我们通过 spring-cloud-a 和 spring-cloud-a-gray 的日志去查看消息消费的情况。可以看到,消息的灰度功能已经生效, spring-cloud-a-gray 这个环境,只会消费带有 gray 标的消息,spring-cloud-a 这个环境,只会消费未打标的流量生产出来的消息。

在截图中我们可以看见,spring-cloud-a-gray 环境输出的日志  topic:TEST_MQ, producer: Cgray [10.25.0.102] , invoke result: Agray[10.25.0.101] -> Bgray[10.25.0.25] -> Cgray[10.25.0.102], spring-cloud-a-gray 只会消费 Cgray 生产出来的消息,而且消费消息过程中发起的 Spring Cloud 调用,结果也是 Agray[10.25.0.101] -> Bgray[10.25.0.25] -> Cgray[10.25.0.102],即在灰度环境闭环。

而 spring-cloud-a 这个环境,输出的日志为 topic:TEST_MQ,producer:C[10.25.0.157],invoke result:A[10.25.0.100] -> B[10.25.0.152] -> C[10.25.0.157],只会消费 C 的基线环境生产出来的消息,且在这个过程中发起的 Spring Cloud 调用,也是在基线环境闭环。

步骤五:调整消息的标签过滤规则,并进行验证

因为考虑到实际场景中,spring-cloud-c 应用和 spring-cloud-a  应用的所有者可能不是同一个人,不一定能够做到两者同时进行灰度发布同步的操作,所以在消息的灰度中,未打标环境默认的行为是消费所有消息。这样 spring-cloud-c 在进行灰度发布的时候,可以不需要强制 spring-cloud-a 应用也一定要同时灰度发布,且使用相同的环境标。

spring-cloud-a 在消费时候,未打标环境的行为的选择权是交给 spring-cloud-a 的所有者,如果需要实现未打标环境不消费 c-gray 生产出来的消息,只需要在控制台进行配置即可,配置之后实时生效。

  1. 调整 spring-cloud-a 未打标环境的过滤规则。比如这里我们要选择未打标环境不再消费 gray 环境生产出来的消息,只需要在“未打标环境忽略的标签”里面选择 gray,然后点击确定即可。

  1. 调整规则之后,规则是可以动态地生效,不需要进行重启的操作,我们直接查看 spring-cloud-a 的日志,验证规则调整生效。

从这个日志中,我们可以看到,此时基线环境可以同时消费 gray 和 基线环境生产出来的消息,而且在消费对应环境消息时产生的 Spring Cloud 调用分别路由到 gray 和 基线环境中。

操作总结

  1. 全链路消息灰度的整个过程是不需要修改任何代码和配置的。
  2. 目前仅支持 RocketMQ,Client 版本需要在 4.5.0 之后的版本。RocketMQ Server 端需要支持 SQL92 规则过滤,即开源 RocketMQ 需要配置 enablePropertyFilter=true,阿里云 RocketMQ 需要使用铂金版。
  3. 开启消息灰度后,MSE Agent 会修改消息消费者的 group,如原来的消费 group 为 group1,环境标签为 gray,则 group 会被修改成 group1_gray,如果使用的是阿里云 RocketMQ,需要提前创建好修改后的 group。
  4. 开启和关闭消息灰度后,应用需要重启才能生效;修改未打标环境忽略的标签功能可以动态生效,不需要重启。

相关链接

[1] MSE 微服务治理专业版:

微服务治理基础版升级专业版 - 微服务引擎MSE - 阿里云

[2] Kubernetes 集群:

创建Kubernetes专有版集群 - 容器服务 ACK - 阿里云

[3] 容器服务控制台:

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

[4] MSE 治理中心控制台

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

原文链接

本文为阿里云原创内容,未经允许不得转载。 

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

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

相关文章

普洛斯数据中心发布DC Brain系统,科技赋能智慧化运营管理

7月5日&#xff0c;普洛斯数据中心发布了DC Brain智慧化运营管理系统。该系统由普洛斯历时两年自主研发&#xff0c;契合现代化数据中心平台的发展趋势。目前已应用于普洛斯旗下数据中心&#xff0c;并有对外输出的成功案例&#xff0c;面向行业&#xff0c;赋能中小规模运营商…

mi6 android版本,小米6:我依旧是王,MIUI10.4.2稳定版与AndroidP同时到来

原标题&#xff1a;小米6&#xff1a;我依旧是王&#xff0c;MIUI10.4.2稳定版与AndroidP同时到来小米6作为小米数字系列最受欢迎的机型之一&#xff0c;从上市到下架热度一直未减&#xff0c;它也是众多米粉心目中小米数字系列最成功的机型没有之一。但是&#xff0c;再怎么讲…

如何利用 AHAS 保障 Web 服务稳如磐石?

简介&#xff1a;应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品&#xff0c;基于阿里开源流控降级组件 Sentinel&#xff0c;以流量与容错为切入点&#xff0c;从流量控制、不稳定调用隔离、熔断降级、热点流量…

KubeDL HostNetwork:加速分布式训练通信效率

简介&#xff1a;ubeDL 为分布式训练作业带来了 HostNetwork 网络模式&#xff0c;支持计算节点之间通过宿主机网络相互通信以提升网络性能&#xff0c;同时适应 RDMA/SCC 等新型高性能数据中心架构的网络环境&#xff0c;此外&#xff0c;KubeDL 针对 HostNetwork 模式带来的 …

阿里云容器服务差异化 SLO 混部技术实践

简介&#xff1a;阿里巴巴在“差异化 SLO 混合部署”上已经有了多年的实践经验&#xff0c;目前已达到业界领先水平。所谓“差异化 SLO”&#xff0c;就是将不同类型的工作负载混合运行在同一节点&#xff0c;充分利用工作负载对资源 SLO 需求特征的不同&#xff0c;提升资源整…

鸿蒙系统被烧毁,华为鸿蒙操作系统再次被质疑 国产是原罪

国产是原罪&#xff0c;国际驰名双标现象严重&#xff0c;为何对待国产的东西要格外刻薄&#xff1f;华为手机版鸿蒙系统正式发布&#xff0c;但却引来一片嘲讽&#xff0c;这些人简直是刷新三观。如果一个产品是相同的价格&#xff0c;国产的用料更足但是还不够成熟&#xff1…

云原生落地大爆发,企业和开发者如何把握先机?

简介&#xff1a;回顾 2021 年&#xff0c;云原生有哪些重大技术突破&#xff1f;云原生时代下开发模式、技术标准等不断变化&#xff0c;企业应该如何落地云原生&#xff1f;开发者应掌握哪些能力&#xff1f;本文将为你一一解说。 作者&#xff1a;伍杏玲 随着云计算产业走…

Gartner发布中国人工智能软件市场指南,激烈竞争下走向差异化

作者 | Gartner高级研究总监 方琦 供稿 | Gartner 人工智能&#xff08;AI&#xff09;软件是中国企业投资和关注的重点。中国的AI软件市场在持续快速增长&#xff0c;竞争非常激烈。AI软件企业使用一种或多种AI技术&#xff08;见图1&#xff09;&#xff0c;帮助企业解读事件…

华为Mate是鸿蒙系统,华为mate30概念新机:4500mAh+5G网络+“鸿蒙”系统 这才是华为...

对于现在的华为手机来说&#xff0c;很多消费者的态度不一样&#xff0c;有的觉得华为手机性价比不高&#xff0c;有的则觉得华为手机质量很好&#xff0c;配置也非常的高。而我觉得&#xff0c;华为手机最值得敬佩&#xff0c;敬佩的是华为不屈的精神&#xff0c;敬佩的是远见…

平安保险基于 SPI 机制的 RocketMQ 定制化应用

简介&#xff1a;本文讲讲述平安保险为何选择 RocketMQ&#xff0c;以及在确定使用消息中间件后&#xff0c;又是如何去选择哪款消息中间件的。 作者&#xff1a;孙园园&#xff5c;平安人寿资深开发 为什么选用 RocketMQ 首先跟大家聊聊我们为什么会选用 RocketMQ&#xff…

Redis 内存优化神技,小内存保存大数据

作者 | 码哥呀来源 | 码哥字节这次跟大家分享一些优化神技&#xff0c;当你面试或者工作中你遇到如下问题&#xff0c;那就使出今天学到的绝招&#xff0c;一招定乾坤&#xff01;❝如何用更少的内存保存更多的数据&#xff1f;我们应该从 Redis 是如何保存数据的原理展开&…

SchedulerX 如何帮助用户解决分布式任务调度难题?

简介&#xff1a;本文分别对任务调度平台的资源定义、可视化管控能力、分布式批处理能力进行了简述&#xff0c;并基于 SchedulerX 的能力结合实际业务场景提供了一些基础参考案例。希望通过上述内容能让大家方便地熟悉任务调度平台接入使用概况&#xff0c;对于现有用户也可结…

如何做“健康码”的性能压测

简介&#xff1a;随着无线设备的普及和 5G 的大力建设&#xff0c;越来越多的线上系统、小程序成为了人们生活中必不可少的工具。对于这些工具&#xff0c;都会面对一个问题&#xff1a;系统能承受多少用户同时访问&#xff0c;面对突发的流量洪峰&#xff0c;能否保证系统无故…

对话 MySQL 之父:一个优秀程序员可抵5个普通程序员

【CSDN 编者按】MySQL之父Monty有着四十多年的编程经验&#xff0c;从儿时的兴趣到长大后的深耕&#xff0c;他在编程领域不断钻研&#xff0c;最终成为编程大师。《新程序员004》带你走进Monty的程序人生&#xff0c;谈谈他在编程方面的最新感悟以及对未来的预测。作者 | 郭露…

服务网格 ASM 年终总结:最终用户如何使用服务网格?

简介&#xff1a;本文不打算回顾 Istio 或是阿里云服务网格 ASM 的变化或趋势&#xff0c;我们来聊一聊阿里云 ASM 服务网格&#xff0c;它的最终用户是如何使用服务网格的。 作者&#xff1a;叶剑宏 背景 阿里云服务网格 ASM 于 2020 年 2 月公测&#xff0c;近 2 年的时间…

使用 nginx 轻松管理 kubernetes 资源文件

作者 | 江小南来源 | 江小南和他的小伙伴们引言nginx在传统的使用中&#xff0c;一般是作为反向代理或者负载均衡。但是它还有一个很优秀的能力常被人们所忽略。在kubernetes部署应用的过程中&#xff0c;会有大量的yaml等资源需要维护。集群内部维护起来不太方便&#xff0c;特…

Dubbo-go 优雅上下线设计与实践

简介&#xff1a;在分布式场景下&#xff0c;微服务进程都是以容器的形式存在&#xff0c;在容器调度系统例如 k8s 的支持下运行&#xff0c;容器组 Pod 是 K8S 的最小资源单位。随着服务的迭代和更新&#xff0c;当新版本上线后&#xff0c;需要针对线上正在运行的服务进行替换…

华为鸿蒙网络,这回真翻脸了?被谷歌“除名”,官宣鸿蒙手机版,华为:走着瞧...

与电脑系统类似&#xff0c;手机操作系统如今也已经被安卓和苹果的iOS瓜分殆尽&#xff0c;根据数据&#xff0c;安卓和iOS已经占据了手机操作系统99%以上的市场份额。不过由于iOS是苹果自研的封闭系统&#xff0c;所以在智能手机这么多年发展下来&#xff0c;也就自然地形成了…

SaaS服务的私有化部署,这样做最高效|云效工程师指北

简介&#xff1a;为了能够有效且高效地同时管理SaaS版本和私有化版本的发布过程&#xff0c;云效团队也结合云原生的基础设施和标准化工具&#xff08;比如helm&#xff09;进行了一系列的探索和实践&#xff0c;并将其中一些通能的能力进行了产品化。本文从问题本身出发&#…

阿里 BladeDISC 深度学习编译器正式开源

简介&#xff1a;随着深度学习的不断发展&#xff0c;AI模型结构在快速演化&#xff0c;底层计算硬件技术更是层出不穷&#xff0c;对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来&#xff0c;还要应对计算框架的持续迭代。深度编译器就成了应对以上…