用户您好!请先登录!

Archives2019

Java Unsafe应用解析

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

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

基本介绍

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

阅读更多

常用的序列化框架

xml序列化

在java发展早期开始,为了统一接口,xml协议横空出世,良好的可读性,自由度极高的扩展性,成了很长一段时间的序列化标准规范。实现xml序列化/反序列化的方案有很多,最常见的是XStream 和 Java 自带的 XML 序列化和反序列化两种 ,并且还有基于xml协议的soap协议实现的webservice接口等。可以说xml序列化是开发中最常见也是发展时间最久的协议,并且支持跨进程和跨语言交互,但是缺陷也很明显,即xml规范下的每一个属性和值都是固定的标签形式,导致序列化后的字节流文件很大,远超于java自身的序列化方案,而且效率很低,一般建议使用在内部系统或者性能要求不高,但是对于接口的复杂度和准确性要求比较高的接口交互,或者适合多语言多进程之间交互的统一规范,不适合QPS过高的工程使用

阅读更多

百度转发引擎 BFE 开源,拼Nginx?

BFE(Baidu Front End,百度统一前端)是百度的统一七层流量转发平台,目前已接入百度大部分流量,每日转发请求接近 1 万亿,峰值 QPS 超过 1000 万。为了促进负载均衡技术的交流和发展,百度决定开源 BFE 转发引擎。

据了解,作为综合的流量转发平台,BFE 平台主要集成了以下 4 大功能:

• 流量接入和转发:支持 HTTP、HTTPS、HTTP/2、QUIC 等多种协议,并支持强大的应用层路由能力

• 流量全局调度:支持由外网流量调度和内网流量调度共同构成的全局流量调度系统

• 安全和防攻击:支持黑名单封禁、精细限流和应用层防火墙(WAF)等多种防攻击能力

• 实时数据分析:支持分钟级的超高维度时序报表

阅读更多

Git内部原理

前言

近几年技术发展十分迅猛,让部分同学养成了一种学习知识停留在表面,只会调用一些指令的习惯。我们时常有一种“我会用这个技术、这个框架”的错觉,等到真正遇到问题,才发现事情没有那么简单。

后来我开始沉下心,回归一开始接触编程的时候,那时候学习一个知识都会深入一点去思考背后的原理。但这并不是说掌握并会使用高级Api不重要,他们也非常重要,并且是日常工作中大部分时间都在使用的,快速掌握它们意味着高效学习,可以快速的应用在开发生产上。

只是有时候知道一些底层的东西,可以更好的帮你理清思路,知道你真正在操作什么,不会迷失在Git大量的指令和参数上面。

阅读更多

大数据平台架构的设计

近年来,随着IT技术与大数据、机器学习、算法方向的不断发展,越来越多的企业都意识到了数据存在的价值,将数据作为自身宝贵的资产进行管理,利用大数据和机器学习能力去挖掘、识别、利用数据资产。如果缺乏有效的数据整体架构设计或者部分能力缺失,会导致业务层难以直接利用大数据大数据,大数据和业务产生了巨大的鸿沟,这道鸿沟的出现导致企业在使用大数据的过程中出现数据不可知、需求难实现、数据难共享等一系列问题,本文介绍了一些数据平台设计思路来帮助业务减少数据开发中的痛点和难点。

1. 大数据技术栈

大数据整体流程涉及很多模块,每一个模块都比较复杂,下图列出这些模块和组件以及他们的功能特性,后续会有专题去详细介绍相关模块领域知识,例如数据采集、数据传输、实时计算、离线计算、大数据储存等相关模块。

阅读更多

无限扩展的分布式消息队列,How?

几十年前,消息队列开始兴起,它用于连接大型机和服务器应用程序,并逐渐在企业的服务总线与事件总线设计模式、应用间的路由和数据迁移中发挥至关重要的作用。自此,应用程序架构和数据角色经历了重大变化:例如,面向服务的架构、流处理、微服务、容器化、云服务和边缘计算,这些只是诸多变化中的冰山一角。这些变化创造了大量的新需求,这些新需求远远超出了原有消息队列的技术能力。

为了满足这些需求,处理消息队列的全新方法应运而生。现代应用对消息解决方案的要求不仅仅是主动连接、移动数据,而是要在持续增长的服务和应用中智能处理、分析和传输数据,并且在规模持续扩大的情况下不增加运营负担。

阅读更多

布隆过滤器简介

在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题。如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题。

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难

阅读更多

React Native在美团外卖客户端的实践

MRN简介

MRN(Meituan React Native) 是基于开源的React Native框架改造并完善而成的一套动态化方案,在开发体验上基本能与原生RN保持一致,同时从业务需求的角度满足从开发、构建、测试、部署、运维的工程化需要。解决了一系列痛点问题:客户端版本审核及更新效率低、Android/iOS/Web三端开发技术方案不一致、公共需求重复劳动、需求排期不敏捷、集成成本高等。目前MRN已接入美团数十个App,在核心框架及生态工具上有超过百位代码贡献者,(每天)的总 PV 超过1亿次。

在项目成立之初,MRN使用当时最新的React Native 0.54.3作为基础版本,然后进行了一系列的改造。React Native官方稳定版已经升至0.60.5,对MRN页面的质量性能、开发者体验都有了巨大的提升,包括JSI替换桥进行JS和Native通信、JS引擎替换、React Hooks等功能。最近,MRN也做了一些升级适配和深度优化,在相关基础建设、融合过程、优化手段等方面,我们进行了很多的探索和思考,后续这些内容会陆续放出,希望能给大家一些启发。本文主要分享美团外卖App在业务实践和技术探索过程中的经验。

阅读更多

常用的微服务RPC框架

开源 RPC 框架有哪些呢?

一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的。

跟语言平台绑定的开源 RPC 框架主要有下面几种:

  • Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
  • Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。
  • Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。
  • Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言

而跨语言平台的开源 RPC 框架主要有以下几种:

  • gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
  • Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。

阅读更多

用Java中的条件队列,实现阻塞队列

什么是条件队列

条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态,并加入到对应条件队列中。条件队列,即当对象获取到同步锁之后,如果调用了wait方法,当前线程会进入到条件队列中,并释放锁。

synchronized(对象){ // 获取锁失败,线程会加入到同步队列中 
    while(条件不满足){
        对象.wait();// 调用wait方法当前线程加入到条件队列中
    }
}

基于synchronized的内置条件队列存在一些缺陷。每个内置锁都只能有一个相关联的条件队列,因而存在多个线程可能在同一个条件队列上等待不同的条件谓词,并且在最常见的加锁模式下公开条件队列对象。

阅读更多

图解AQS的设计与实现,实现互斥锁

AQS是并发编程中非常重要的概念,它是juc包下的许多并发工具类,如CountdownLatch,CyclicBarrier,Semaphore 和锁, 如ReentrantLock, ReaderWriterLock的实现基础,提供了一个基于int状态码和队列来实现的并发框架。本文将对AQS框架的几个重要组成进行简要介绍,读完本文你将get到以下几个点:

  1. AQS进行并发控制的机制是什么
  2. 共享模式和独占模式获取和释放同步状态的详细过程
  3. 基于AQS框架实现一个简易的互斥锁

1. AQS基本概念

AQS(AbstractQueuedSynchronizer)是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量来表示状态,通过内置的FIFO(first in,first out)队列来完成资源获取线程的排队工作。

阅读更多

CouchDB-技术概述

1. 文档存储

一个承载着CouchDB服务器主机的数据库,以文档方式存储。每个文档在数据库中都有唯一的名称,CouchDB提供一个RESTful HTTP API来读取和更新(添加、编辑、删除)数据库文档。

文档是CouchDB中的主要数据单元,由任意数量的字段和附件组成。文档还包括数据库系统维护的元数据。文档字段是唯一命名的,并且包含不同类型的值(文本、数字、布尔值、列表等),并且没有对文本大小或元素数量的设置限制。

CouchDB文档更新模型是无锁且乐观的。文档编辑是通过客户机应用程序加载文档、应用更改并将它们保存回数据库来完成的。如果另一个编辑相同文档的客户端首先保存其更改,则客户端在保存时将获得编辑冲突错误。要解决更新冲突,可以打开最新的文档版本,重新应用编辑并再次尝试更新。

阅读更多

MongoDB和Cassandra的对比

MongoDB和Cassandra都属于NoSQL数据库系列,它们也恰好都是开源,但是,它们的相似之处仅此而已。

MongoDB和Cassandra之间的相似之处

在深入探讨MongoDB和Cassandra的不同之处之前,让我们先看看它们的相似之处。

显然,它们都是数据库。更重要的是,它们都是NoSQL数据库。NoSQL是一种数据库架构类型,其中数据主要以相对非结构化的方式存储。与更传统的SQL式数据库相比,NoSQL可以更有效地存储大量非结构化数据,企业在大数据操作中通常会涉及非结构化数据。

阅读更多

MongoDB、Cassandra和 Mysql的对比

1. 为什么是Nosql?

1.1. Nosql在大数据处理相对于关系型数据库具有优势

  • 低延迟的读写速度: 大量数据的写入和读取可达 Wops/sec的速率
  • 海量的数据和流量:可以支持高效的查询,应对高并发请求。
  • 大规模集群的管理:分布式应用能更简单的部署和管理;
  • 关系型数据库由于存在类似Join这样多表查询机制,使得数据库在扩展方面很艰难;
  • 关系型数据库读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重;

阅读更多

Kudu与HBase的简要分析与对比

Cloudera在2016年发布了新型的分布式存储系统——kudu,kudu目前也是Apache下面的开源项目。Hadoop生态圈中的技术繁多,HDFS作为底层数据存储的地位一直很牢固。而HBase作为Google BigTable的开源产品,一直也是Hadoop生态圈中的核心组件,其数据存储的底层采用了HDFS,主要解决的是在超大数据集场景下的随机读写和更新的问题。

Kudu的设计有参考HBase的结构,也能够实现HBase擅长的快速的随机读写、更新功能。那么同为分布式存储系统,HBase和Kudu二者有何差异?两者的定位是否相同?我们通过分析HBase与Kudu整体结构和存储结构等方面对两者的差异进行比较。

阅读更多

顶级的Node.js框架

在Node.js之前,Web开发人员总是面临着必须为客户端和服务器端脚本使用不同语言的问题。传统上,JavaScript是使用浏览器中运行的HTML代码进行客户端脚本编写的语言。Node.js在2009年的发明引入了服务器端脚本,其中JavaScript代码在服务器上运行,并在将它们返回到浏览器之前生成完整的动态网页。这是Web开发的一项重大突破,因为Node.js允许在客户端和服务器端使用JavaScript。

巨大的JavaScript社区很快意识到在客户端和服务器端脚本中使用相同语言的优势,Node.js已成为Web开发的流行环境。开发人员已经为Node.js开发创建了许多框架来促进Web应用程序的开发。

阅读更多

推荐几个在线效率工具

1. Can I Use

如果你曾经想了解浏览器对 Web API(例如 local storage)的兼容性,那么 Can I Use 是个不错的选择。它为桌面版和移动版浏览器提供了一个表格,这个表格包含了这些浏览器对 Web API 的最新支持情况。

提高开发效率的 9 个工具

各种浏览器对 local storage 的支持情况

阅读更多

RabbitMQ那点事

RabbitMQ是什么?

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMPQ

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

它可以使对应的客户端(client)与对应的消息中间件(broker)进行交互。消息中间件从发布者(publisher)那里收到消息(发布消息的应用,也称为producer),然后将他们转发给消费者(consumers,处理消息的应用)。由于AMQP是一个网络协议,所以发布者、消费者以及消息中间件可以部署到不同的物理机器上面。

阅读更多

简谈Zookeeper基本原理

ZooKeeper简介

ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

java核心知识点整理—ZooKeeper基本原理

ZooKeeper设计目的

1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

2.可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。

阅读更多

Flutter背后解决了哪些问题

Flutter 出现的历史背景

为不同的操作系统开发拥有相同功能的应用程序,开发人员只有两个选择:

  1. 使用原生开发语言(即 Java 和 Objective-C),针对不同平台分别进行开发。
  2. 使用跨平台解决方案,对不同平台进行统一开发。

原生开发方式的体验最好,但研发效率和研发成本相对较高;而跨平台开发方式研发虽然效率高,但为了抹平多端平台差异,各类解决方案暴露的组件和 API 较原生开发相比少很多,因此研发体验和产品功能并不完美。

所以,最成功的跨平台开发方案其实是依托于浏览器控件的 Web。浏览器保证了 99% 的概率下 Web 的需求都是可以实现的,不需要业务将就“技术”。不过,Web 最大的问题在于它的性能和体验与原生开发存在肉眼可感知的差异,因此并不适用于对体验要求较高的场景。

阅读更多

《重构》概要

1. 重构概述

1.1 重构的概念(What)

Refactoring

名词:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低修改成本。

动词:使用一系列重构方法,在不改变软件可观察行为的前提下,调整其结构。

1.2 为什么要重构(Why)

改进软件设计

提高代码质量和可读性,使软件系统更易理解和维护

帮助尽早的发现缺陷

提高编程速度

阅读更多


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