How to write a good unit test
WhatA unit test is a type of software testing that focuses on verifying the correctness of individual units of a software system. A unit, in this context, refers to the smallest testable part of a system, typically a method.
A unit test can verify different behavioural aspects of the system under test, but most likely it will fall into one of the following two categories: state-based or interaction-based. Verifying that the system under test produces correct results, or that its resulting state ...
面试指南之消息中间件:RocketMQ
@[toc]
序该篇 Chat 会通过在段落的一开始引入一个或多个面试问题,然后围绕着该问题对对应的技术做介绍说明,最后在段落的最后会提供一个回答示例来结束这以问题。回答示例是基于笔者自己的经验的,读者可以结合自己的实际情况整理个更好的回答,可以的话在评论中展示出来让更多的同学参考学习。另外,通常面试题上下之间会有关联,是一个渐进的过程。类似面试过程中的由浅入深。
消息中间件简介
面试题:为什么你的系统中需要引入消息中间件?
消息中间件是指一种在需要进行网络通信的系统进行通道的建立,数据或文件发送的中间件。消息中间件的一个重要作用是可以跨平台操作,为不同操作系统上的应用软件集成提供便利。
现在越来越多的分布式应用系统采用消息中间件方式来构建,人们通过使用消息中间件把应用扩展到不同的操作系统和不同的网络环境。基于消息的机制更适用于由事件驱动的应用,当一个事件发生时,消息中间件通知服务方应该进行如何操作。
通常,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。这也是系统引入消息中间件的一般理由。
比如说:
两个系统需要信息交互,但是各自所在的平台不同或使用的开发语言不 ...
程序员的副业: 微信小程序
准备 & 开发打工仔谁不想整点副业,整点睡后收入呢?
虽然很早之前就知道淘宝客的模式,但是懒并且知道主要是推广难。所以一直也没有去弄,最近时间比较多,就还是决定整它一整。做好决定后我就开始准备相关的东西了。其实事情不多,主要有如下一些准备工作
成为淘宝客
去淘宝开放平台申请成为淘宝客,淘宝客分三个等级 低级 - 中级 - 高级。
对应的佣金会不一样。可以直接花钱找人刷到高级
服务器
整它一个服务器,这边用的是腾讯云。因为还有新用户资格。省不少钱!!
三年才三百!腾讯云活动
营业执照
因为要对接微信支付,所以需要企业资质。但是个体户也 OK。所以要提前准备好。如果在深圳的话,全程线上办理就
OK。不要在网上找什么代办!!!! 个体工商户办理流程
申请公众号/小程序
直接上 开放平台 整就行了
相关技术调研。直接从简,使用的是如下技术/开源组件:
Vant
Spring Boot
Spring JPA
MySQL
上线了经过一段时间的开发,我的小程序笔笔省现在已经上线了。微信搜索 笔笔省
就可以找到。这个小程序可以方便自己平时买东西领 ...
延时任务一锅端
场景延时任务的需求是非常常见的,在我们的开发生涯中,我相信大部分研发人员是会有接触到这一块的。其中,我们在现实生活中比较常接触到的场景有
下单后未付款通知
订单延迟生成短信通知
红包未领取退款通知
用户行程将近通知
微信公众号的文章延时发布推送等
常规模块
存储主要负责存储任务的相关信息,比如任务执行所需要的相关信息,执行时间,重试次数等
调度负责时间的调度,判断任务是否到达可执行
执行负责任务的实际执行
在非分布式的情况下,通常这三者是出现在同一个应用内部的;但如果是在分布式系统架构中,那么存储、执行和调度通常是分开的,并且一个任务还可能分割成多个
子任务分别在不同的服务上运行。分布式情况下,每一个模块可选的方案都不少,多样且复杂;但是最终都需要单体内实现的支持,我们这里就只讨论单体模式下的延
时任务方案。
常规解决方案
进程内的
ScheduledThreadPoolExecutor
时间轮(HashedWheelTimer)
进程外的
通过定时任务框架(Quartz/Elastic-Job/Elastic-Job/QSch ...
Redis 问答 PK
前言作为一个后端程序员,面试过程中难免会被问到缓存的一些问题,而目前来说,Redis 就是使用的最为广泛的一个缓存中间件了。下面我们就以 Redis 为例,说一说面试过程中会经常会被问到的一些面试题。并试着了解面试官所想,抓住重点,奋力一击,让面试不再烦恼。
Redis 简介首先,简单回顾下 Redis 的简介,并提供一个思路范式。
Redis 是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,HyperLogLogs 等数据类型。内置复制、Lua 脚本、LRU 收回、事务,以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。根据月度排行网站 DB-Engines 的数据,Redis 是最流行的键值对存储数据库。
上面是对 Redis 的一个基本介绍,但是在学习一门新技术的时候,一般至少需要考虑三个基本问题 WWH:
WHAT:是什么,该技术是什么,有什么特性
WHY:为什么,为什么要使用该技术,该技术解决了什么问题 ...
Java 多线程
本次本章从线程的基础讲到线程的相关实现类,每个章节算是一小块知识点,在每个知识点中,穿插地讲对应的知识原理,以及对应的常见面试题及其解答。多数面试题是前后环环相扣的。
什么是线程线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(Call Stack),自己的寄存器环境(Register Context),自己的线程本地存储(Thread-local Storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务。在多核或多 CPU,或支持 Hyper-threading 的 CPU 上使用多线程程序设计的好处是显而易见的,即提高了程序的执行吞吐率。在单 CPU 单核的计算机上,使用多线程技术,也可以把进程中负责 I/O 处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的 workhorse ...
在 Maven 中央仓库发布自己的开源项目
写代码久了,一直在用别人提供的第三方包依赖,有时是不是也会想着有一天别人能够使用自己的开源出去的项目。让我们从最简单的开始,提取一个小项目,将其开源并发布到中央仓库让大伙可以直接通过配置 Maven 依赖来使用。
寻找项目方案我相信应该是有不少人都有过开源并发布自己项目的想法的,但是其中最大的一个问题可能就是不知道该写点什么了、不知道有什么东西可以开源出去让别人使用的。没有关系,这边带你慢慢来提取出一个可行的项目方案。
开源项目的种类多种多样,来源更是不用多说,我们这里不整这些这么广泛复杂的项目,我们就是想体验下将自己的项目构建发布到 Maven 中央仓库的快感。那么其实有一个特别容易的项目可以立马自己就着手设计的:实现 API。
目前很多大平台都有开放自己的 API 接口,不少都是 HTTP 协议的接口,但是并不是所有的都有提供对应的 Java 客户端,那么这就是我们的机会啦,我们可以封装这些接口,提供对应的客户端,让其他用户可以开箱即用。目前一些开放接口的平台有:
WeChat
Pinterest
微博 API
Medium’s API
Hacker News API
…… ...
[译]深入理解 Node.js Worker Threads
最近工作中又有可能需要写 Node.js 应用了,距离上次写 Node.js 应用也有好些年了,所以就开始
重新熟悉下 Node.js 了。刚好最近又在学 Go,其最大的特点就是简单、轻量级的并发模型。非常容易
用它编写一个能够充分利用硬件资源的高性能应用。于是不免想起以前学习 Node.js 时会遇到的问题:如何
让 Node.js 充分利用多核 CPU 的资源。于是,让我发现了,Node.js 从 v10.5.0 开始引入
worker_threads 模块来解决该问题。并让我发现了这篇文章。
此文为译文,原文如下。
译自 Deep Dive into Worker Threads in Node.js
多年来,Node.js 一直都不是实现 CPU 密集型应用的最佳选择。其中最主要的原因就是 Node.js 仅仅
是 Javascript 而 JavaScript 是单线程的。作为该问题一个解决方法,Node.js 从 v10.5.0 开
始引入了实验性的 Worker Threads 概
念,并将其体现在 worker_threads 模块,该模块从 Node.js v ...
压测对比: Spring WebFlux VS. Spring MVC
前言最近工作有个小项目,其场景主要是封装内部的接口请求,然后做个转换之后,就请求外部请求,之后再
将外部响应转换成内部的统一格式,其实有点类似一个简单网关的应用,虽然也有一些业务逻辑在里面,
但是主要场景还是请求的转发处理,是一个 IO 密集型的应用,而且外部请求的延迟相对比较大而且不可控。
我想,这不正合适 Spring 5 出来的那个新特性的一个应用场景么。于是决定探究下 Spring Web
on Reactive Stack: Spring WebFlux.
Spring WebFluxSpring WebFlux 作为一个响应式(reactive-stack) web 框架补充,在 5.0 的版本开始加入到
Spring 全家桶。这是一个完全非阻塞的,支持 Reactive Streams, 运行在诸如 Netty, Undertow,
以及 Servlet 3.1+ 容器上的。Spring WebFlux 可以让你使用更少的线程去处理并发请求,同时能够让你使用更少的硬件资源来拓展
你的应用。
下图是他们的一个区别。
Spring MVC
构建于 Servlet ...
Kafka 概览
简介Apache Kakfa 是一个分布式流处理平台,既可以当做普通的消息中间件用于消息发布订阅,也可以存储并处理流式数据,其分布式设计使得其有较好的容错性,水平拓展性等。
通常可以用于当做消息订阅发布用于业务系统中,或者用于大数据方向,接受存储大量的流式数据并和对应的大数据处理框架结合使用,eg. Kafka + Samza
从物理部署层面来讲,其主要有如下几个模块:
ZooKeeper
用于元数据保存以及事件通知
Broker
Kafka 的核心部分,用 scala 实现,负责处理客户端请求,持久化消息数据等
Client(Consumer & Producer)
客户端,Java 实现。生产者消费者实现
下面分别从这几个模块来讲解 Kafka 相关的实现[基于 Kafka 2.4]。
相关概念
Broker
Consumer
Producer
Controller
GroupCoordinator
TransactionCoordinator
Topic
Partition
Replicas
ZooKeeperApache ZooKeeper 在 Kafk ...