企业实践|分布式系统可观测性之应用业务指标监控

简介:本文主要讲述如何建立应用业务指标Metrics监控和如何实现精准告警。Metrics 可以翻译为度量或者指标,指的是对于一些关键信息以可聚合的、数值的形式做定期统计,并绘制出各种趋势图表。透过它,我们可以观察系统的状态与趋势。

作者简介:

赵君|南京爱福路汽车科技有限公司基础设施部云原生工程师,过去一直从事 java 相关的架构和研发工作。目前主要负责公司的云原生落地相关工作,负责 F6 基础设施和业务核心应用全面上云和云原生化改造。

徐航|南京爱福路汽车科技有限公司基础设施部云原生工程师,过去一直负责数据库高可用以及相关运维和调优工作。目前主要负责研发效能 DevOps 的落地以及业务系统云原生可观测性的改造。

随着分布式架构逐渐成为了架构设计的主流,可观测性(Observability)一词也日益被人频繁地提起。

2017 年的分布式追踪峰会(2017 Distributed Tracing Summit)结束后,Peter Bourgon 撰写了总结文章《Metrics, Tracing, and Logging》系统地阐述了这三者的定义、特征,以及它们之间的关系与差异。文中将可观测性问题映射到了如何处理指标(metrics)、追踪(tracing)、日志(logging)三类数据上。

其后,Cindy Sridharan 在其著作《Distributed Systems Observability》中,进一步讲到指标、追踪、日志是可观测性的三大支柱(three pillars)。

到了 2018 年, CNCF Landscape 率先出现了 Observability 的概念,将可观测性( Observability )从控制论( Cybernetics )中引入到 IT 领域。在控制论中,可观测性是指系统可以由其外部输出,来推断其内部状态的程度,系统的可观察性越强,我们对系统的可控制性就越强。

可观测性可以解决什么问题?Google SRE Book 第十二章给出了简洁明快的答案:快速排障

There are many ways to simplify and speed troubleshooting. Perhaps the most fundamental are:
  • Building observability—with both white-box metrics and structured logs—into each component from the ground up
  • Designing systems with well-understood and observable interfaces between components.

Google SRE Book, Chapter 12

而在云原生时代,分布式系统越来越复杂,分布式系统的变更是非常频繁的,每次变更都可能导致新类型的故障。应用上线之后,如果缺少有效的监控,很可能导致遇到问题我们自己都不知道,需要依靠用户反馈才知道应用出了问题。

本文主要讲述如何建立应用业务指标Metrics监控和如何实现精准告警。Metrics 可以翻译为度量或者指标,指的是对于一些关键信息以可聚合的、数值的形式做定期统计,并绘制出各种趋势图表。透过它,我们可以观察系统的状态与趋势。

技术栈选择

我们的应用都是 Spring Boot 应用,并且使用 Spring Boot Actuator 实现应用的健康检查。从 Spring Boot 2.0 开始,Actuator 将底层改为 Micrometer,提供了更强、更灵活的监测能力。Micrometer 支持对接各种监控系统,包括 Prometheus。

所以我们选择 Micrometer 收集业务指标,Prometheus 进行指标的存储和查询,通过 Grafana 进行展示,通过阿里云的告警中心实现精准告警。

指标收集

对于整个研发部门来说,应该聚焦在能够实时体现公司业务状态的最核心的指标上。例如 Amazon 和 eBay 会跟踪销售量, Google 和 Facebook 会跟踪广告曝光次数等与收入直接相关的实时指标。

Prometheus 默认采用一种名为 OpenMetrics 的指标协议。OpenMetrics 是一种基于文本的格式。下面是一个基于 OpenMetrics 格式的指标表示格式样例。

# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027
http_requests_total{method="post",code="400"}    3# Escaping in label values:
msdos_file_access_time_seconds{path="C:\\DIR\\FILE.TXT",error="Cannot find file:\n\"FILE.TXT\""} 1.458255915e9# Minimalistic line:
metric_without_timestamp_and_labels 12.47# A weird metric from before the epoch:
something_weird{problem="division by zero"} +Inf -3982045# A histogram, which has a pretty complex representation in the text format:
# HELP http_request_duration_seconds A histogram of the request duration.
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.05"} 24054
http_request_duration_seconds_bucket{le="0.1"} 33444
http_request_duration_seconds_bucket{le="0.2"} 100392
http_request_duration_seconds_bucket{le="0.5"} 129389
http_request_duration_seconds_bucket{le="1"} 133988
http_request_duration_seconds_bucket{le="+Inf"} 144320
http_request_duration_seconds_sum 53423
http_request_duration_seconds_count 144320# Finally a summary, which has a complex representation, too:
# HELP rpc_duration_seconds A summary of the RPC duration in seconds.
# TYPE rpc_duration_seconds summary
rpc_duration_seconds{quantile="0.01"} 3102
rpc_duration_seconds{quantile="0.05"} 3272
rpc_duration_seconds{quantile="0.5"} 4773
rpc_duration_seconds{quantile="0.9"} 9001
rpc_duration_seconds{quantile="0.99"} 76656
rpc_duration_seconds_sum 1.7560473e+07
rpc_duration_seconds_count 2693

指标的数据由指标名(metric_name),一组 key/value 标签(label_name=label_value),数字类型的指标值(value),时间戳组成。

metric_name ["{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]

Meter

Micrometer 提供了多种度量类库(Meter),Meter 是指一组用于收集应用中的度量数据的接口。Micrometer 中,Meter 的具体类型包括:Timer, Counter, Gauge, DistributionSummary, LongTaskTimer, FunctionCounter, FunctionTimer, and TimeGauge

  • Counter 用来描述一个单调递增的变量,如某个方法的调用次数,缓存命中/访问总次数等。支持配置 recordFailuresOnly,即只记录方法调用失败的次数。Counter 的指标数据,默认有四个 label:class, method, exception, result。
  • Timer 会同时记录 totalcount, sumtime, maxtime 三种数据,有一个默认的 label: exception。
  • Gauge 用来描述在一个范围内持续波动的变量。Gauge 通常用于变动的测量值,比如队列中的消息数量,线程池任务队列数等。
  • DistributionSummary 用于统计数据分布。

应用接入流程

为了方便微服务应用接入,我们封装了 micrometer-spring-boot-starter。micrometer-spring-boot-starter 的具体实现如下。

1.引入 Spring Boot Actuator 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>${micrometer.version}</version>
</dependency>

2.进行初始配置

Actuator 默认开启了一些指标的收集,比如 system, jvm, http,可以通过配置关闭它们。其实仅仅是我们需要关闭,因为我们已经接了 jmx exporter 了。

management.metrics.enable.jvm=false
management.metrics.enable.process=false
management.metrics.enable.system=false

如果不希望 Web 应用的 Actuator 管理端口和应用端口重合的话,可以使用 management.server.port 设置独立的端口。这是好的实践,可以看到黑客针对 actuator 的攻击,但是换了端口号,不暴露公网问题会少很多。

1management.server.port=xxxx

3.配置 spring bean

TimedAspect 的 Tags.empty() 是故意的,防止产生太长的 class 名称对 prometheus 造成压力。

@PropertySource(value = {"classpath:/micrometer.properties"})
@Configuration
public class MetricsConfig {@Beanpublic TimedAspect timedAspect(MeterRegistry registry) {return new TimedAspect(registry, (pjp) -> Tags.empty());}@Beanpublic CountedAspect countedAspect(MeterRegistry registry) {return new CountedAspect(registry);}@Beanpublic PrometheusMetricScrapeEndpoint prometheusMetricScrapeEndpoint(CollectorRegistry collectorRegistry) {return new PrometheusMetricScrapeEndpoint(collectorRegistry);}@Beanpublic PrometheusMetricScrapeMvcEndpoint prometheusMvcEndpoint(PrometheusMetricScrapeEndpoint delegate) {return new PrometheusMetricScrapeMvcEndpoint(delegate);}}

应用接入时,引入 micrometer-spring-boot-starter 依赖

<dependency><groupId>xxx</groupId><artifactId>micrometer-spring-boot-starter</artifactId>
</dependency>

现在,就可以通过访问 http://ip:port/actuator/prometheus,来查看 Micrometer 记录的数据。

自定义业务指标

Micrometer 内置了 Counted 和 Timed 两个 annotation。可以通过在对应的方法上加上 @Timed 和 @Counted 注解,来收集方法的调用次数,时间和是否发生异常等信息。

@Timed

如果想要记录打印方法的调用次数和时间,需要给 print 方法加上 @Timed 注解,并给指标定义一个名称。

@Timed(value = "biz.print", percentiles = {0.95, 0.99}, description = "metrics of print")
public String print(PrintData printData) {}

在 print 方法上加上 @Timed 注解之后,Micrometer 会记录 print 方法的调用次数(count),方法调用最大耗时(max),方法调用总耗时(sum)三个指标。percentiles = {0.95, 0.99} 表示计算 p95,p99 的请求时间。记录的指标数据如下。

biz_print_seconds_count{exception="none"} 4.0
biz_print_seconds_sum{exception="none"} 7.783213927
biz_print_seconds_max{exception="none"} 6.14639717
biz_print_seconds{exception="NullPointerException"} 0.318767104
biz_print_seconds{exception="none",quantile="0.95",} 0.58720256
biz_print_seconds{exception="none",quantile="0.99",} 6.157238272

@Timed 注解支持配置一些属性:

  • value:必填,指标名
  • extraTags:给指标定义标签,支持多个,格式  {"key", "value", "key", "value"}
  • percentiles:小于等于 1 的数,计算时间的百分比分布,比如 p95,p99
  • histogram:记录方法耗时的 histogram 直方图类型指标

@Timed 会记录方法抛出的异常。不同的异常会被记录为独立的数据。代码逻辑是先 catch 方法抛出的异常,记录下异常名称,然后再抛出方法本身的异常:

try {return pjp.proceed();
} catch (Exception ex) {exceptionClass = ex.getClass().getSimpleName();throw ex;
} finally {try {sample.stop(Timer.builder(metricName).description(timed.description().isEmpty() ? null : timed.description()).tags(timed.extraTags()).tags(EXCEPTION_TAG, exceptionClass).tags(tagsBasedOnJoinPoint.apply(pjp)).publishPercentileHistogram(timed.histogram()).publishPercentiles(timed.percentiles().length == 0 ? null : timed.percentiles()).register(registry));} catch (Exception e) {// ignoring on purpose}
}

@Counted

如果不关心方法执行的时间,只关心方法调用的次数,甚至只关心方法调用发生异常的次数,使用 @Counted 注解是更好的选择。recordFailuresOnly = true 表示只记录异常的方法调用次数。

@Timed(value = "biz.print", recordFailuresOnly = true, description = "metrics of print")
public String print(PrintData printData) {}

记录的指标数据如下。

biz_print_failure_total{class="com.xxx.print.service.impl.PrintServiceImpl",exception="NullPointerException",method="print",result="failure",} 4.0
counter 是一个递增的数值,每次方法调用后,会自增 1。
private void record(ProceedingJoinPoint pjp, Counted counted, String exception, String result) {counter(pjp, counted).tag(EXCEPTION_TAG, exception).tag(RESULT_TAG, result).register(meterRegistry).increment();
}private Counter.Builder counter(ProceedingJoinPoint pjp, Counted counted) {Counter.Builder builder = Counter.builder(counted.value()).tags(tagsBasedOnJoinPoint.apply(pjp));String description = counted.description();if (!description.isEmpty()) {builder.description(description);}return builder;
}

Gauge

Gauge 用来描述在一个范围内持续波动的变量。Gauge 通常用于变动的测量值,例如雪花算法的 workId,打印的模板 id,线程池任务队列数等。

  1. 注入 PrometheusMeterRegistry
  2. 构造 Gauge。给指标命名并赋值。
@Autowired
private PrometheusMeterRegistry meterRegistry;public void buildGauge(Long workId) {Gauge.builder("biz.alphard.snowFlakeIdGenerator.workId", workId, Long::longValue).description("alphard snowFlakeIdGenerator workId").tag("workId", workId.toString()).register(meterRegistry).measure();
}

记录的指标数据如下。

biz_alphard_snowFlakeIdGenerator_workId{workId="2"} 2

配置 SLA 指标

如果想要记录指标时间数据的 sla 分布,Micrometer 提供了对应的配置:

management.metrics.distribution.sla[biz.print]=300ms,400ms,500ms,1s,10s

记录的指标数据如下。

biz_print_seconds_bucket{exception="none",le="0.3",} 1.0
biz_print_seconds_bucket{exception="none",le="0.4",} 3.0
biz_print_seconds_bucket{exception="none",le="0.5",} 10.0
biz_print_seconds_bucket{exception="none",le="0.6",} 11.0
biz_print_seconds_bucket{exception="none",le="1.0",} 11.0
biz_print_seconds_bucket{exception="none",le="10.0",} 12.0
biz_print_seconds_bucket{exception="none",le="+Inf",} 12.0

存储查询

我们使用 Prometheus 进行指标数据的存储和查询。Prometheus 采用拉取式采集(Pull-Based Metrics Collection)。Pull 就是 Prometheus 主动从目标系统中拉取指标,相对地,Push  就是由目标系统主动推送指标。Prometheus  官方解释选择  Pull  的原因。

Pulling over HTTP offers a number of advantages:

 

  • You can run your monitoring on your laptop when developing changes.
  • You can more easily tell if a target is down.
  • You can manually go to a target and inspect its health with a web browser.
Overall, we believe that pulling is slightly better than pushing, but it should not be considered a major point when considering a monitoring system.

Prometheus 也支持 Push 的采集方式,就是 Pushgateway。

For cases where you must push, we offer the Pushgateway.

为了让 Prometheus 采集应用的指标数据,我们需要做两件事:

1.应用通过 service 暴露出 actuator 端口,并添加 label: monitor/metrics

apiVersion: v1
kind: Service
metadata:name: print-svclabels:monitor/metrics: ""
spec:ports:- name: custom-metricsport: xxxxtargetPort: xxxxprotocol: TCPtype: ClusterIPselector:app: print-test

2.添加 ServiceMonitor

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: metricslabels:app: metric-monitor
spec:namespaceSelector:any: trueendpoints:- interval: 15sport: custom-metricspath: "/manage/prometheusMetric"selector:matchLabels:monitor/metrics: ""

Prometheus 会定时访问 service 的 endpoints (http://podip:port/manage/prometheusMetric),拉取应用的 metrics,保存到自己的时序数据库。

Prometheus 存储的数据是文本格式,虽然 Prometheus 也有 Graph,但是不够炫酷,而且功能有限。还需要有一些可视化工具去展示数据,通过标准易用的可视化大盘去获知当前系统的运行状态。比较常见的解决方案就是 Grafana。Prometheus 内置了强大的时序数据库,并提供了 PromQL 的数据查询语言,能对时序数据进行丰富的查询、聚合以及逻辑运算。通过在 Grafana 配置 Prometheus 数据源和 PromQL,让 Grafana 去查询 Prometheus 的指标数据,以图表的形式展示出来。

1. grafana 配置 Prometheus 数据源

2. 添加看板,配置数据源,query 语句,图表样式

3. 可以在一个 dasborad 添加多个看板,构成监控大盘。

精准告警

任何系统都不是完美的,当出现异常和故障时,能在第一时间发现问题且快速定位问题原因就尤为重要。但要想做到以上这两点,只有数据收集是不够的,需要依赖完善的监控和告警体系,迅速反应并发出告警。

我们最初的方案是,基于 Prometheus operator 的 PrometheusRule 创建告警规则, Prometheus servers 把告警发送给 Alertmanager,Alertmanager 负责把告警发到钉钉群机器人。但是这样运行一段时间之后,我们发现这种方式存在一些问题。SRE 团队和研发团队负责人收到的告警太多,所有的告警都发到一个群里,打开群消息,满屏的告警标题,告警级别,告警值。其中有需要运维处理的系统告警,有需要研发处理的应用告警,信息太多,很难快速筛选出高优先级的告警,很难快速转派告警到对应的处理人。所以我们希望应用告警可以精准发送到应用归属的研发团队。

经过一段时间的调研,我们最终选择阿里云的《ARMS 告警运维中心》来负责告警的管理。ARMS 告警运维中心支持接入 Prometheus 数据源,支持添加钉钉群机器人作为联系人。

1. 收集研发团队的钉钉群机器人的 webhook 地址,创建机器人作为联系人。

2. 给每个研发团队分别配置通知策略,通知策略筛选告警信息里的 team 字段,并绑定对应的钉钉群机器人联系人。

通过这个方式,实现了应用的告警直接发送到对应的研发团队,节省了信息筛选和二次转派的时间,提高了告警处理效率。

效果如下:

ARMS 告警运维中心支持接入 grafana,zabbix,arms 等多种数据源,具有告警分派和认领,告警汇总去重,通过升级通知方式对长时间没有处理的告警进行多次提醒,或升级通知到领导,保证告警及时解决。

原文链接

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

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

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

相关文章

1024 程序员节城市嘉年华,共话技术生涯的一万种可能!

更硬核的技术峰会&#xff0c;更多元的主题论坛&#xff0c;更丰富的科技元素……更热血的 1024 程序员节闪亮登场&#xff01;由湖南湘江新区管委会主办&#xff0c;长沙工业与信息化局、长沙信息产业园管委会与 CSDN 联合承办的第三届 2022 1024 程序员节将于 10 月 22 - 24 …

作业帮在线业务 Kubernetes Serverless 虚拟节点大规模应用实践

简介&#xff1a;目前方案已经成熟&#xff0c;高峰期已有近万核规模的核心链路在线业务运行在基于阿里云 ACKECI 的 Kubernetes Serverless 虚拟节点。随着业务的放量&#xff0c;未来运行在 Serverless 虚拟节点上的服务规模会进一步扩大&#xff0c;将节省大量的资源成本。 …

浅析微服务全链路灰度解决方案

简介&#xff1a;帮助应用发布版本过程中更精细化&#xff0c;提高了发布过程中的稳定性。服务转移⾄请求链路上进行流量控制&#xff0c;有效保证了多个亲密关系的服务顺利安全发布以及服务多版本并⾏开发&#xff0c;进⼀步促进业务的快速发展。 作者&#xff1a; 十眠&…

译:零信任对 Kubernetes 意味着什么

这篇是 Buoyant 的创始人 William Morgan 文章《# What Does Zero Trust Mean for Kubernetes?》[1]的翻译&#xff0c;文章很好的解释了什么是零信任、为什么要实施零信任&#xff0c;以及服务网格如何以最小的代码实现零信任。零信任是营销炒作&#xff0c;还是新的机会&…

Serverless 应用中心:Serverless 应用全生命周期管理平台

简介&#xff1a;Serverless 应用中心&#xff0c;是阿里云 Serverless 应用全生命周期管理平台。通过 Serverless 应用中心&#xff0c;用户在部署应用之前无需进行额外的克隆、构建、打包和发布操作&#xff0c;即可快速部署和管理应用。Serverless 应用中心帮助用户快速联动…

云钉一体:EventBridge 联合钉钉连接器打通云钉生态

简介&#xff1a;今天&#xff0c;EventBridge 联合钉钉连接器&#xff0c;打通了钉钉生态和阿里云生态&#xff0c;钉钉的生态伙伴可以通过通道的能力驱动阿里云上海量的计算力。 作者&#xff1a;尘央 背景 “以事件集成阿里云&#xff0c;从 EventBridge 开始”是 EventB…

开源当道,群英荟萃!1024 程序员节北京峰会火热来袭

1024 程序员节&#xff0c;致敬每一位二进制世界的主角。由开放原子开源基金会主办&#xff0c;北京经开区国家信创园、CSDN 承办的 2022 1024 程序员节北京峰会将于 10 月 24 日精彩来袭。以“软件新时代 开源创未来”为主题&#xff0c;聚焦开源新潮流&#xff0c;诚邀广大程…

超全,一图了解 2022 长沙 · 中国 1024 程序员节!

超全版来啦&#xff01;2022 长沙 中国 1024 程序员节重磅大咖再聚&#xff0c;共话中国技术新生态你想了解的全在这里收藏&#xff01;收藏&#xff01;收藏&#xff01;

1024 程序员节技术英雄会鸣锣开场,问道中国技术新生态

战鼓鸣&#xff0c;英雄至。10 月 24 日&#xff0c;2022 长沙中国 1024 程序员节重磅环节“技术英雄会”鸣锣开场&#xff01;中国工程院院士、开源掌门人领衔&#xff0c;各领域专家、精英云集&#xff0c;围绕本届大会主题“算力新时代&#xff0c;开源创未来”&#xff0c;…

无尽创想!CSDN 1024 大赛重磅发布

在构建科技世界的过程中&#xff0c;1024 这个数字被赋予了特殊的意义&#xff0c;它代表着广大的程序员群体&#xff0c;更蕴藏着无穷的想象力与价值。在 1024 程序员节发展为程序员的盛会之后&#xff0c;1024 大赛应运而生&#xff0c;并作为 1024 程序员节全新的板块重磅发…

小镇青年程序员的逆袭人生:从差点回老家到荔枝技术骨干

编者按&#xff1a; 1024 是 2 的十次方&#xff0c;是二进制计数的基本计量单位之一。在计算机的发展史中&#xff0c;在和 0/1 所代表的二进制世界里&#xff0c;有人用代码编织出了形形色色的数字、程序、互联网&#xff0c;创造出一个个神话。 ——他们就是一群可爱、低调…

1024统信举办首届技术开放日,硬核技术引领操作系统“大迁移”

10月24日程序员节之际&#xff0c;统信软件首届技术开放日在国家信创园区圆满落下帷幕。统信软件首届技术开放日囊括UP主直播互动、打卡探园、“大迁移”主题论坛、全系产品体验等精彩环节。来自统信软件研发部门负责人、行业专家、技术大咖以及专业媒体代表百余人莅临活动现场…

FFA 议程上线!实时化浪潮下,Apache Flink 还将在大数据领域掀起怎样的变革?...

Flink Forward Asia 2022 将于 11 月 26-27 日在线上举办&#xff0c;议程内容正式上线&#xff01;今年是 Flink Forward Asia&#xff08;下文简称 FFA&#xff09;落地中国的第五个年头&#xff0c;也是 Flink 成为 Apache 软件基金会顶级项目的第八年。过去这几年&#xff…

全面提升易用性:OpenClusterManagement 0.7 版本发布

简介&#xff1a;千呼万唤始出来&#xff0c;三月末 OpenClusterManagement 社区正式发布了 v0.7 版本。在新的版本有一系列新的功能特性欢迎感兴趣的读者体验探索&#xff0c;同时在这个版本中社区维护者对目前已有的功能也修复了一些问题并对面向最终用户的体验进行了打磨和提…

“晕乎乎的概念”:阿里云函数计算的“应用”又是个啥

简介&#xff1a;为什么阿里云函数计算发布了这么多功能&#xff0c;只有少数的功能会伴随着体验活动一起来做运营&#xff1f;那么这个“应用”到底是何方神圣&#xff1f;他和现在“服务”&#xff0c;“函数”有啥关系&#xff1f; 作者&#xff1a;刘宇 曾经&#xff0c;…

如何使用阿里云 CDN 对部署在函数计算上的静态网站进行缓存

简介&#xff1a;为了进一步提升网站的访问速度&#xff0c;我们会使用 CDN 对网站进行加速&#xff0c;但是最近在调试阿里云的函数计算和 CDN 的配合使用时发现了一个需要额外注意的地方。 作者&#xff1a;邓超 | Serverless Devs 开源贡献者 前言 为了进一步提升网站的访…

放弃支持 SQL 惹争议,CEO:你可以怪我!

整理 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;作为关系型数据库的标准语言&#xff0c;SQL 凭借着功能丰富、使用方便灵活、语言简洁等特性备受欢迎&#xff0c;行业中如 MySQL、Oracle、SQL Server、Sybase、Informix 等主流数据库都将 SQL 作为其标…

解决方案|致拓T8数字化ERP

简介&#xff1a;通过快速构建敏捷ERP系统&#xff0c;实现从销售到财务的全流程闭环管理&#xff0c;助力企业数字化升级。 「致拓T8数字化ERP」解决方案聚焦业财一体&#xff0c;助力企业卓有成效地提升经营收益&#xff0c;赋能企业个性化数字生产管理。本解决方案由上海致…

携手数字人、数字空间、XR平台,阿里云与伙伴共同建设“新视界”

简介&#xff1a;2022阿里云视觉计算私享会&#xff1a;加速虚拟与现实的交互。 引言&#xff1a;2022年互联网行业里XR、数字孪生、虚拟现实等领域再次“翻红”、新旧概念频出&#xff0c;不少人相信这些技术将给当下的互联网行业乃至传统行业带来翻天覆地的变化。虽然XR的应…

六大挑战下,如何利用云原生数据战略打造数据驱动型企业?

在刚刚落幕的2022亚马逊云科技中国峰会上&#xff0c;亚马逊云科技大中华区战略业务发展部总经理顾凡带来《亚马逊云科技 成为探路者&#xff0c;成就探路者》主题演讲&#xff0c;总结了数据驱动型企业面临的六大挑战&#xff0c;并提供了解决思路。IDC预测&#xff0c;仅在20…