0%

这样一篇文章,主要是对自己近期所学重新梳理时,所做下的一篇笔记。

对MySQL近期所学的笔记,希望能帮助到一些人。

文章记录在notion中,点击下列查看
notion: MySQL学习

这样一篇文章,主要是对自己近期所学重新梳理时,所做下的一篇笔记。

网络上已经存在大量对Eureka的介绍和原理剖析,不过这些文章存在很多重复雷同,对知识点总结不够清晰,对原理流程介绍又不够形象。本篇文章不算是完全原创,主要还是对这些文章的整理(见文末参考),对格式、内容有所删选,图片也来自不同的文章,在此感谢各个作者的分享。

Eureka 简介

Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。

Eureka 有哪些组件?

9A94ADCB-5226-46C1-97F0-878E5B76DC31

阅读全文 »

1. 需求

目前每个应用如果想要使用分布式id功能, 都需要在各自的数据库中新增did表,在代码中加入mapper等,使用较麻烦. 现在希望将分布式id生成器功能封装成工具类提供.

  • 期望做到引入maven依赖即可使用, 且做到本地生成分布式id时高性能、不重复.
  • 并且需要适用于之后容器化部署的场景.
  • 设计简单可靠, 尽量减少第三方业务的依赖

2. 现状

img

阅读全文 »

调优前的程序运行状态

机器:

MacBook Pro (Retina, 13-inch, Early 2015)
cpu 2.7 GHz Intel Core i5
mem 8 GB 1867 MHz DDR3

IDEA 信息

IntelliJ IDEA 2019.1.4 (Ultimate Edition)
Build #IU-191.8026.42, built on July 30, 2019
JRE: 1.8.0_212-release-1586-b4 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.14
阅读全文 »

处于学习netty的目的, 需要进行一些项目时间. 目前的工作暂时接触不到相关的内容, 所以考虑自己造一个项目.

目前网上已经有对应的项目了: Netty 入门与实战:仿写微信 IM 即时通讯系统, 花了几分钟看了一下, 似乎没有看到比较困难的点, 基本上就是实现了基础功能吧. 这篇文章主要介绍的还是netty的一些常用操作和属性, 适合我用来入门查看.

开新项目的目标:

  • 学习 netty, 上手netty的使用方法
  • 不要太关注im系统的详细设计, 而是围绕基本的功能点进行底层原理的学习, 做到掌握 netty.
  • 从基本的原型开始 , 不断迭代, 并记录每一次优化后的性能差距, 形成文档.
  • 对一些技术难点, 一定要做好记录.
  • 最好能够应用到一些场景, 如实时客服等.
  • 其次, 希望能运用上ddd的思想
  • 在跑满本机性能的情况下(90%cpu, 6G jvm), 尽可能多得优化代码性能, 并作出总结. baidu
  • 掌握压测工具: jmeter 高并发压测

任务安排:

阅读全文 »

基本

server, 以ubuntu为例

# 一键安装wireguard 脚本 Ubuntu
# 该脚本由 https://github.com/hongwenjun 提供, 建议自行查看该脚本内容, 了解原理
$ wget https://raw.githubusercontent.com/hongwenjun/vps_setup/master/ubuntu_wireguard_install.sh | bash

之后拷贝生成的 client.conf 内容

client, 以mac为例

阅读全文 »

本篇主要介绍task的创建与运行过程

文章开头, 先抛出一些疑问:

  1. 为什么TaskTransfer、TaskReceiver 要在初始化Task的时候创建, 为什么不在Worker里直接创建好? 这么做有什么好处呢?
  2. TaskTransfer/Receiver 与 Task 是1对1的关系么? 如果是,为什么? 如果不是,那设置了怎样的值, 为什么?
  3. start up bolt 发给系统 bolt 是做什么用的?
  4. 至于在创建拓扑时的并行度等属性, 在提交拓扑时(?确定是这个时候么?)就已经分配好了. 例如 BoltA 并行度为 3, 那么会创建3个Task对象, 每个对象都持有BoltA? 而不是一个Task 持有多个 Executor ,每个Executor使用执行bolt的业务代码 ?
  5. 为什么创建executor时,要传递当前task进去,如 baseExecutor = new BoltExecutors(this) . 而不是传递必须的参数进去.这是否是为了强调task和executor之间的某种联系?如果是,那么又是什么联系呢? 在较早版本的源代码里面,是否有反映这个联系呢?

创建过程:

阅读全文 »

拓扑会通过 Nimbus 分发给 supervisor, 那么 Nimbus 内部是怎么操作的?
这里以本地模式为例, 对拓扑的提交过程做一个分析.

参考资料:
理解storm拓扑并行度

疑问:

  1. 在zk上建立task信息,这些信息是用来做什么的?
  2. notifyTopologyActionListener 做了什么?

启动

阅读全文 »

对一个 topology,JStorm 最终会调度成一个或多个 worker,每个 worker 即为一个真正的操作系统执行进程,分布到一个集群的一台或者多台机器上并行执行。
而每个 worker 中,又可以有多个 task,分别代表一个执行线程。每个 task 就是上面提到的组件(component)的实现,要么是 spout 要么是 bolt 。

如上图所示, worker 是一个独立 JVM 的进程, 它其实是由 Supervisor 通过命令行执行 Worker#main 方法来启动. worker 进程内部, 运行着许多线程, 包括: Task 线程、序列化/反序列化线程等. 其对应的代码为: com.alibaba.jstorm.daemon.worker.Worker

注意: Storm 与 JStorm 的 worker 模型有所不同, JStorm 移除了 executor 的概念, 详见“JStorm 中 task 与 executor 的关系”.

启动

阅读全文 »

“虽然池化和重用线程相对于简单地为每个任务都创建和销毁线程是一种进步,但是它并不能消除由上下文切换所带来的开销,其将随着线程数量的增加很快变得明显,并且在高负载下愈演愈烈。此外,仅仅由于应用程序的整体复杂性或者并发需求,在项目的生命周期内也可能会出现其他和线程相关的问题。”

摘录来自: [美] Norman Maurer Marvin Allen Wolfthal. “Netty实战。”

与 Netty 中的 EventLoop 类似, JStorm 中也建立了一套线程模型, 用于简化创建线程的过程, 并提高性能. 其具体的实现便是 AsyncLoopThread .

AsyncLoopThread

com.alibaba.jstorm.callback.AsyncLoopThread

阅读全文 »