Articles by xiayf

  1. 读文笔记:Kafka 官方设计文档

    2019-10-13 Sun
    By xiayf

    原文:http://kafka.apache.org/documentation/#design

    数据持久化

    不用惧怕文件系统

    磁盘的读写速度,取决于如何读写。对于线性读写方式,操作系统做了充分的优化:提前读 - 预取若干数据块,滞后写 - 将小的逻辑写操作合并成一个大的物理写操作。

    研究表明:顺序读写磁盘(sequential disk access)的速度有些时候比随机访问内存还要快

    现代操作系统激进地尽可能将空闲内存用作磁盘缓存。所有磁盘读写都经过操作系统提供的统一缓存。这个特性没法轻易关闭,除非直接 I/O (direct I/O),因此,如果程序在用户进程中进行数据缓存,缓存的数据通常也是和操作系统页缓存重复的,缓存两遍,没啥意义,也浪费内存。

    而且,Kafka 是构建在 JVM 之上的,了解 Java 内存使用方式的人应该都知道:

    1. 对象的内存开销非常高,通常是实际数据大小的2倍(甚至更多 …
  2. 读文笔记:Photon - Fault-tolerant and Scalable Joining of Continuous Data Streams

    2019-10-10 Thu
    By xiayf

    原文:Photon: Fault-tolerant and Scalable Joining of Continuous Data Streams

    Photon 是谷歌广告系统中用于 join 广告曝光日志流和点击日志流的一套系统。

    数据流 join 为什么没用 flink 这类通用的流式处理框架?

    数据流 join,特别是广告数据流 join,技术上难在哪里?

    任一条流都可能乱序或延迟,广告点击涉及计费的问题,计费不能多算广告主的钱,也要尽可能避免漏计费,降低广告收入损失。


    该系统在谷歌生产环境中每分钟处理百万级的事件,端到端延迟小于 10 秒(注:对于广告实时竞价的广告主而言,这个延迟的长短很重要)。

    广告曝光、点击整体流程为:

    1. 用户搜索某个关键词时,谷歌的服务器会返回广告和搜索结果。广告服务器会将广告 query 和结果数据作为日志发送到多个日志数据中心(multiple logs-datacenters),最终持久化存储在 GFS 上。每次 query …
    标签: 论文 笔记
  3. 读文笔记:日志 - 每个软件工程师都应该了解的实时数据统一抽象

    2019-10-10 Thu
    By xiayf

    原文:The Log: What every software engineer should know about real-time data's unifying abstraction

    一句话概括,这篇文章细说了 Kafka 的本质原理、解决的问题、适用性等。

    Kafka 本质上是提供日志数据流。

    日志是客观世界的事件记录。

    A log is perhaps the simplest possible storage abstraction. It is an append-only, totally-ordered sequence of records ordered by time.

    日志数据的特点是:只增不改,自带时间戳,数据存储的先后顺序即(大致)是实际发生的时间先后顺序。

    数据库可以基于日志来还原历史操作行为 …

    标签: 论文 笔记
  4. Lucene 查询解析器语法(译)

    2019-09-04 Wed
    By xiayf

    原文:Query Parser Syntax

    概览

    Lucene 除了提供 API 方便开发者创建查询请求,还通过一个查询解析器(一个词法分析器,使用 JavaCC 将一个字符串翻译成一个 Lucene 查询)提供一种功能丰富的查询语言。

    一般来说,查询解析器支持的语法在不同发布版本之间可能会有变化。当前这个文档页面描述的是当前这个发布版本的语法。如果你正在使用一个不同版本的 Lucene,请参考该版本自带的 docs/queryparsersyntax.html 文档。

    在选择使用这个查询解析器之前,请考虑以下 3 点:

    1. 如果你准备以编程的方式生成一个查询字符串,然后使用查询解析器来解析它。那么,你应该认真考虑一下是否应该直接使用查询 API 来构建查询。换句话说,查询解析器专门用于人类输入的文本,而不是程序生成的文本。
    2. 不可分词(untokenized)的域(译者注:抱歉,此处没太理解)最好直接添加到查询中,而不是通过查询解析器来解析。如果一个域的值是通过应用自动生成的,那么应该为这个域自动生成查询子句 …
  5. 一个 Python 小项目的小结

    2019-08-14 Wed
    By xiayf

    前段时间临时接手一个 Python 小项目,这个项目实现的类似一个管控平台,其中核心功能是为算法同学提供机器学习模型训练任务的全流程管理,平台后端基于 Flask 框架实现,前端基于 Ant Design Pro 实现。

    代码稍微有些乱,所以做了部分代码的重构,在此做点经验小结。

    1、并行化或异步化

    部分请求处理逻辑,由于比较耗时,故使用线程池来加速,或者使用独立线程异步处理,或者先存储一个中间状态,由后台定时任务来完成实际的处理工作。对于异步处理结果,前端通过轮询来获取。

    线程池的使用,主要使用 map 方法:

    from multiprocessing.dummy import Pool
    
    input_list = [...]
    pool: Pool = Pool(len(input_list))
    pool.map(func, input_list)
    pool.close()
    pool.join()
    

    独立线程异步处理 …

    标签: 总结 Python
  6. Reactor 官方文档翻译简化版

    2019-06-26 Wed
    By xiayf

    原文:Reactor 3 Reference Guide

    1. 起步

    1.1 Reactor 简介

    Reactor 是为 JVM 准备的一个完全非阻塞的反应式编程基础组件,支持高效的需求管理(以管理“反压”的形式),直接与 Java 8 的函数式 API 集成,尤其是 CompletableFutureStream 以及 Duration,提供可组合的异步序列 API - Flux(适用于 N 个元素的序列)和 Mono(适用于 0 或 1个元素的序列)--- 并且全面地(extensively)实现了 反应式流(Reative Streams) 规范。

    借助 …

  7. Java System.getProperty VS. System.getenv(译)

    2019-06-25 Tue
    By xiayf

    原文:Java System.getProperty vs System.getenv

    1、简介

    Java 应用代码中会自动引入 java.lang 包。这个包包含很多常用的类,包括 NullPointerExceptionObjectMathString 等等。

    其中 java.lang.System 类是一个 final 类,这意味着开发者无法继承它,其所有方法都是静态的(static)。

    System 类中有两个方法,分别来读取系统属性(system properties)和环境变量(environment variables),下面我们来看看这两者的区别。

    2、使用 System.getProperty()

    Java 平台使用一个 Properties 对象来提供本地系统相关的信息和配置 …

    标签: 翻译 Java
  8. Java 单测伴侣 - mockito

    2019-06-17 Mon
    By xiayf

    其实工作以来,我很少写测试/单测代码,一方面是大部分互联网公司团队对测试的要求不高,另一方面是想写好测试代码还挺难的,挺花时间,其中最麻烦的是待测代码可能会访问外部资源(比如数据库、HTTP API),如果不能方便地进模拟访问这些外部资源,那么测试起来会非常麻烦。

    但,对于复杂逻辑,如果不经过严格测试,发布到生产环境,又有些不放心,没底气,或者在代码重构时,如果没有覆盖全面的测试,很难评估代码变动带来的影响。

    直到遇到 mockito,我才觉得是时候认真写写测试代码了。


    mockito 提供两种对象模拟方式:mockspy

    简单来说,mock 模拟的对象是一个完全假的对象,只是具备指定类型的接口,以 java.util.List 为例:

    import static org.mockito.Mockito.mock;
    
    List mockedList = mock(List.class);
    

    虽然 …

    标签: Java mockito 单测

Page 1 / 2