用户您好!请先登录!

博客

SonarQube那点事

SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检测。

SonarQube特性

持续检查

  • 项目整体的健康程度
    项目的主页面会给出,项目整体的Bugs、Vulnerabilities、Code Smells
  • 专注于漏洞
    water-leak-paradigm可以有效的管理代码质量:新特性,增加的,改变的
    (water-leak-paradigm是sonarqube研究的一种代码管理方法)
    在项目监测报告中,需要密切关注:New Bugs、New Vulnerabilities
  • 实施质量阈值
    在团队项目中,可以设置质量阈值(Quality Gate),用于监管质量
  • 分支分析
    确保干净的代码才会被合并到主分支中
阅读更多

敏捷项目的可视化

敏捷事关“整体团队”经验。我们在一起做计划、在一起编码、在一起测试、在一起检视过去,以便团队中的每一个人都能达成一致的共识。然而,随着项目增大,团队开始迷失在大堆的用户故事里,很难让每个人都能看到相同的全景图(big picture)。本文讨论了可视化全景图的各种方法。不仅可用于负责人和管理者,更可以用于每一个人。

在理想的情况下,敏捷团队应该针对当前迭代提出清晰的计划,而后续的发布计划可以较为粗略。而事实上很多情况是,团队在当前迭代只是急于实现下一步的小创意。他们完全忽略了全景图。通常会有这样一种情况:这张图保存在一个角色的脑中,比如团队领导、业务分析师、项目经理、产品经理、甚至是ScrumMaster。这往往是由于他或她没有真正地推动自组织所导致的。这一现象在某些情况下还是可以接受的,比如一个不重要的短期项目,但在许多情况下,这会造成恶劣的后果,当团队偏离轨道时他们也什么也察觉不到,因为他们觉得所有的工作都还在正常地运转。

阅读更多

模拟超过 5 万用户的并发访问

本文将从负载测试的角度,描述了做一次流畅的5万用户并发测试需要做的事情.

快速的步骤概要

  1. 编写你的脚本
  2. 使用JMeter进行本地测试
  3. BlazeMeter沙箱测试
  4. 使用一个控制台和一个引擎设置Users-per-Engine的数量
  5. 设置并测试你的集合 (1个控制台和10-14 引擎)
  6. 使用 Master / Slave 特性来达成你的最大CC目标

如何模拟超过 5 万用户的并发访问?

阅读更多

「无服务器架构」Knative Eventing

Knative Eventing是一个旨在满足云原生开发的常见需求的系统,并提供可组合的原语以启用后期绑定事件源和事件使用者。

设计概述

Knative Eventing是围绕以下目标设计的:

  1. 原始事件服务是松散耦合的。这些服务可以在各种平台上(例如Kubernetes,VM,SaaS或FaaS)独立开发和部署。
  2. 事件生产者和事件消费者是独立的。任何生产者(或源)都可以在有活动的事件使用者监听之前生成事件。在有生产者创建事件之前,任何事件消费者都可以对事件或事件类别表示兴趣。
  3. 可以将其他服务连接到Eventing系统。这些服务可以执行以下功能:创建新的应用程序而无需修改事件生产者或事件使用者。从生产者那里选择事件的特定子集并将其作为目标。
  4. 确保跨服务的互操作性。 Knative Eventing与由CNCF Serverless WG开发的CloudEvents规范一致。

阅读更多

从VSCode看IDE技术架构

谈起 Web IDE,没人能绕开 VSCode,它非常流行,同时又完全开源,总共 350000 行 TypeScript 代码的巨大工程,使用了 142 个开源库。市面上选择基于 VSCode 去修改定制的 IDE 比比皆是:Weex Studio、白鹭Egret Wing、快应用IDE…

我们从 VSCode 身上看到什么?

  • 大型复杂 GUI 软件(如 IDE 类)如何组织功能模块代码
  • 如何使用 Electron 技术将 Web 软件桌面化
  • 如何在打造插件化开放生态的同时保证软件整体质量与性能
  • 如何打造一款好用的、流行的工具软件

一、VSCode 是什么

官方定义:

从 VSCode 看大型 IDE 技术架构

阅读更多

用.map() .filter() 和.reduce()给代码做“减法”

世间纷乱复杂,我们在不断给自身做“加法”的同时,也要学会对周围的事物做“减法”,将复杂的东西简化,为我所用,并发挥超出原本程度的增幅效果,这才是真正的“高手”。

在“码农圈”,学习如何使用.map()、.filter()和.reduce()函数,我们读到、看到和听到的一切都很复杂,无法理解这些概念,因为它们是独立的学习单元。

听说这些是意味着上升至启蒙状态的入门知识。真希望自己听到的是实话:早点明白这三种方法其实都是识别和实现过程,循环遍历迭代的原因通常属于三个功能类别之一。

回顾之前编写的代码,笔者发现95%的情况下,在对字符串或数组进行循环时,自己都会执行以下操作之一:将语句序列映射(map)到每个值,过滤(filter)满足特定条件的值,或者将数据集减少(reduce)到单个聚合值。

阅读更多

深入浅出分析 PriorityQueue

Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。

总体介绍

前面以Java ArrayDeque为例讲解了StackQueue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器Comparator,类似于C++的仿函数)。

阅读更多

白话微服务架构

微服务是什么?

微服务是一种细粒度(Fine-Grain)的SOA

或许在座的高朋了解过其概念。个人认为,与其说微服务是一种技术,不如将其定义为一种架构,而架构则是"技"的实现与"术"的策略相辅相成。
"术"的策略需要分析使用场景,进行合理地划分业务边界,实现"业以类聚",然而"技"的实现则通过特定的技术在实现业务逻辑之时,更多的考虑实现过程中的效率性、测试的便利性、维护的可持续性,达到"技以群分"的目的。

由此而论,我个人偏好将其定义为:”微服务是一种细粒度的SOA”。

这样定义的好处在于,没必要去重复地”抹黑””单体应用”(Monolithic,也有人翻译成”巨石应用”),缘于SOA技术的衍化过程中早已提及。那么,细粒度更多的体现在”取其精华,去其糟粕”。

阅读更多

MySQL亿级数据同步在小米的运用

MySQL由于自身简单、高效、可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓;如果这时还有实时BI展示的需求,对于MySQL来说是一种灾难。

为了解决sql查询慢,查不了的业务痛点,我们探索出一套完整的实时同步,即席查询的解决方案,本文主要从实时同步的角度介绍相关工作。

早期业务借助Sqoop将MySQL中的数据同步到Hive来进行数据分析,使用过程中也带来了一些问题:

  • 虽然Sqoop支持增量同步但还属于粗粒度的离线同步,无法满足实时性的需求;
  • 每次同步Sqoop以sql的方式向MySQL发出数据请求也在一定程度上对MySQL带来一定的压力;
  • 同时Hive对数据更新的支持也相对较弱。

为了更有效地连接前端业务数据系统(MySQL)和后端统计分析系统(查询分析引擎),我们需要一套实时同步MySQL数据的解决方案。

阅读更多

最佳内存缓存框架Caffeine

Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架。

Cache(缓存),基于Google Guava,Caffeine提供一个内存缓存,大大改善了设计Guava’s cache 和 ConcurrentLinkedHashMap 的体验。

1 LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
2     .maximumSize(10_000)
3     .expireAfterWrite(5, TimeUnit.MINUTES)
4     .refreshAfterWrite(1, TimeUnit.MINUTES)
5     .build(key -> createExpensiveGraph(key));

缓存类似于ConcurrentMap,但二者并不完全相同。最基本的区别是,ConcurrentMap保存添加到其中的所有元素,直到显式地删除它们。另一方面,缓存通常配置为自动删除条目,以限制其内存占用。在某些情况下,LoadingCache或AsyncLoadingCache可能很有用,因为它是自动缓存加载的。

Caffeine提供了灵活的结构来创建缓存,并且有以下特性:

  • 自动加载条目到缓存中,可选异步方式
  • 可以基于大小剔除
  • 可以设置过期时间,时间可以从上次访问或上次写入开始计算
  • 异步刷新
  • keys自动包装在弱引用中
  • values自动包装在弱引用或软引用中
  • 条目剔除通知
  • 缓存访问统计

阅读更多

百亿用户行为数据的秒级分析

导读

用户行为分析是数据分析中非常重要的一项内容,在统计活跃用户,分析留存和转化率,改进产品体验、推动用户增长等领域有重要作用。美团点评每天收集的用户行为日志达到数百亿条,如何在海量数据集上实现对用户行为的快速灵活分析,成为一个巨大的挑战。为此,我们提出并实现了一套面向海量数据的用户行为分析解决方案,将单次分析的耗时从小时级降低到秒级,极大的改善了分析体验,提升了分析人员的工作效率。

本文以有序漏斗的需求为例,详细介绍了问题分析和思路设计,以及工程实现和优化的全过程。

问题分析

下图描述了转化率分析中一个常见场景,对访问路径“首页-搜索-菜品-下单-支付”做分析,统计按照顺序访问每层节点的用户数,得到访问过程的转化率。

阅读更多

分布式系统中的一致性协议

目前分布式系统中常见的一些一致性协议:两阶段提交协议,三阶段提交协议,向量时钟,RWN协议,paxos协议,Raft协议。

一. 两阶段提交协议(2PC)

两阶段提交协议,简称2PC,是比较常用的解决分布式事务问题的方式,要么所有参与进程都提交事务,要么都取消事务,即实现ACID中的原子性(A)的常用手段。

两阶段提交将提交过程划分为连续的两个阶段:表决阶段(Voting)和提交阶段(Commit)。假设在没有故障发生的情形下,两阶段提交协议由下列操作序列构成,如下图所示:

分布式系统中的一致性协议总结

阅读更多

如何提升RestAPI开发效率

团队内部RestAPI开发采用设计驱动开发的模式,即使用API设计文档解耦前端和后端的开发过程,双方只在联调与测试时耦合。在实际开发和与前端合作的过程中,受限于众多因素的影响,开发效率还有进一步提高的空间。本文的目的是优化工具链支持,减少一部分重复和枯燥的劳动。

现状梳理

前后端工作流

  • 需求理解:前后端先理解产品思路、需求的详细内容
  • 敲定接口:后端出API设计文档初稿,与前端面对面或者在线讨论修正,接着后端(有时是前端)把API描述记录到公司内部的API文档库(在线markdown编辑器,提供分级目录的存储功能,对如何描述API没有一定的标准,因此描述格式不统一,因人而异1)。接着根据双方工作的安排,约定联调时间
  • 独立开发:双方独立开发(也有可能非完全独立开发,如需要对方的环境配合等;或者存在返工,如API设计发生变更等)
  • 系统联调:测试API基本功能和双方系统的连通性
  • 测试回归:开发或者QA编写测试用例并测试业务流程

阅读更多

Kafka大话原理

周末无聊刷着手机,某宝网APP突然蹦出来一条消息“为了回馈老客户,女朋友买一送一,活动仅限今天!”。买一送一还有这种好事,那我可不能错过!忍不住立马点了去。于是选了两个最新款,下单、支付一气呵成!满足的躺在床上,想着马上有女朋友了,竟然幸福的失眠了……

第二天正常上着班,突然接到快递小哥的电话:

小哥:“你是xx吗?你的女朋友到了,我现在在你楼下,你来拿一下吧!”。

我:“这……我在上班呢,可以晚上送过来吗?“。

小哥:“晚上可不行哦,晚上我也下班了呢!”。

于是两个人僵持了很久……

最后小哥说,要不我帮你放到楼下小芳便利店吧,你晚上下班了过来拿,尴尬的局面这才得以缓解!

阅读更多

微服务下的鉴权

从单体应用架构到分布式应用架构再到微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本文将会为大家阐述微服务架构下的安全认证与鉴权方案。

一、单体应用 VS 微服务

随着微服务架构的兴起,传统的单体应用场景下的身份认证和鉴权面临的挑战越来越大。单体应用体系下,应用是一个整体,一般针对所有的请求都会进行权限校验。请求一般会通过一个权限的拦截器进行权限的校验,在登录时将用户信息缓存到 session 中,后续访问则从缓存中获取用户信息。

微服务架构下的鉴权,怎么做更优雅?

阅读更多

Reactor和Proactor模型

Reactor模型

Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),多路复用器返回并将事先注册的相应I/O事件分发到对应的处理器中。

Reactor是一种事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。

阅读更多

人工智能的下一个拐点:图神经网络

1. GNN:从尝鲜进入快速爆发期

今年以来,图神经网络技术(Graph Neural Network, GNN)得到了学术界极大的关注与响应。各大学术会议纷纷推出 GNN 相关的 workshop,在投中的论文中,以 Graph Network 为关键词的论文数量也呈现井喷之势,下图给出了近三年,上述关键词在各学术会议上的增长趋势:

人工智能的下一个拐点:图神经网络迎来快速爆发期

阅读更多

Netflix Keystone实时流处理平台

Keystone流处理平台是Netflix的数据骨干,是实现工程数据驱动文化的重要基础架构。 虽然Keystone专注于数据分析,但值得一提的是,还有另一个Netflix自主研发的反应流处理平台Mantis,该平台针对运营用例。 我们将在以后的文章中讨论Mantis及其在Netflix生态系统中的重要作用。

如今,Keystone平台提供两种生产服务:

  • 数据管道:启用了流传输的路由服务和启用了Kafka的消息服务,共同负责几乎实时地生成,收集,处理,聚合和移动所有微服务事件。
  • 流处理即服务(SPaaS):使用户能够构建和运行自定义的托管流处理应用程序,从而使他们能够专注于业务应用程序逻辑,而平台则提供了规模缩放,运营和领域专业知识。

在本文中,我们将探讨一些挑战,设计原则,平台思维方式,高级架构,最后是平台为Netflix提供的愿景和核心价值。

单个流作业的剖析:

Keystone实时流处理平台

…并且平台管理以下工作:

阅读更多

蚂蚁金服亿级并发下的移动端到端网络接入架构解析

支付宝移动端架构已完成了工具型 App、平台型 App,以及超级 App 三个阶段的迭代与逐步完善。

本次分享将聚焦支付宝在移动网络接入架构的具体演进,以及应对新春红包等项目在亿级并发场景下的具体应对之道。此外,我们将延展探讨蚂蚁金服移动网络技术如何对外商业化应用和输出。

一. 蚂蚁金服移动网络接入架构演进

蚂蚁金服亿级并发下的移动端到端网络接入架构解析

支付宝移动网络第一代架构

阅读更多

饿了么的App架构演进

时代演进,技术也随之发展。到今天,APP已然成为绝大多数互联网企业用来获取用户的核心渠道。与此同时,伴随着业务量的增长,愈来愈大、愈来愈多的APP也在不断地、持续地挑战着每一个移动端研发人员的知识深度.

而我们的移动端技术人员也在这个不断接受挑战的过程中,成就了今天的移动互联网时代。像外卖、打车、12306这种工具,背后的逻辑其实非常复杂。

饿了么移动APP就是这样一个挑战,多用户量、多业务量,在接受着更多更挑剔用户的同时,默默地、不断地演进着移动端的架构。

MVC

我们常说,脱离业务谈架构就是纯粹的刷流氓。饿了么移动APP的发展也是其业务发展的一面镜子。

在饿了么业务发展的早期,移动APP经历从无到有的阶段。为了快速上线抢占市场,传统移动APP开发的MVC架构成了“短平快”思路的首选:

干货推荐|饿了么app的架构演进之路,你的外卖可不简单 

这种架构以层次结构简单清晰,代码容易开发而被大多数人所接受。

阅读更多

技术架构的战略和战术原则

技术架构,是将产品需求转变为技术实现的过程。技术架构解决的问题包括了如何进行纯技术层面的分层、开发框架选择、语言选择(这里以 JAVA 语言为主)、涉及到各自非功能性需求的技术点(安全、性能、大数据)。技术架构是确定组成应用系统实际运行的技术组件、技术组件之间的关系,以及部署到硬件的策略。

技术架构面临最大的挑战是“不确定性”。在技术架构上,很多时候就会面临这种选择。是要选择业界最新的技术?还是选择团队最熟悉的技术?如果选择最新的技术,遇到新技术出了问题怎么解决?如果选择目前熟悉的技术,后续技术演进怎么办?这些都是架构师在做技术架构过程中需要考虑的。

阅读更多

Java Unsafe应用解析

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。

本文对sun.misc.Unsafe公共API功能及相关应用场景进行介绍。

基本介绍

如下Unsafe源码所示,Unsafe类为一单例实现,提供静态方法getUnsafe获取Unsafe实例,当且仅当调用getUnsafe方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常。

阅读更多


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20