Kafka

Kafka 是一个分布式,分区,复制日志服务,它提供了一个消息传递功能,但是它的设计的独特的.使用的是TCP协议,支持多种语言. 它的构造很简单:

Topics and Logs

Topic: 是高度抽象化的概念,他是kafka发布消息的一种类型,topic被分为多个partition.

Partition:每个partition都有操作日志,在partition内部消息都是按照顺序写入的(每个消息都有一个offset标记),所以消息都是持久化的,如:log被配置为2天,那么这个消息将一直保存知道2天后被消费掉.kafka的效率不会受消息大小限制,log里面只保存消费者的offeset,同时消费者访问partition时没有很多的限制,你甚至可以使用tail命令来查看任何一个topic里的消息是否被消费了.使用partition的目的有几个:1、由于每个分区都必须在一个服务器上,但是一个主题可以有多个分区,这样就容量上面就没有了限制.2、同事每个分区又是并行的. partition(类似分布式文件系统)分布在集群中,所有服务共享这些partition,partition之间的数据会被复制,用于容错.每个partition都有一个leader和0-n个flower,flower会复制leader的数据,如果leader crash了flower会自动变为leader.对于同一个服务器,可能有多个leader partition和flower partition存在,这样来保持一个平衡.

producer

生产者决定将消息分配给topic的哪个partition,默认使用round-robin,也可以在消息中指明用哪种算法进行分配.

consumer

kafka 将传统的public-subscribe,queue两种类型的消息抽象为统一的 consumer-group,消息会被发送到所有订阅的consumer-group,而这个消息只会被consumer-group中的其中一个实例consumer接收到.所以,如果所有的consumer实例都使用相同的consumer-group名称,那就相当于queue的工作方式。如果所有订阅的consumer 都有不同的consumer-group名称,那就相当于publish-subscribe工作方式 .

虽然传统的消息中间件都有对消息顺序进行控制,但是当一个队列有多个消费者时由于消费时是一个异步的过程,这样很可能就打乱了消息的顺序,kafka有partitoin,consumer-group,consumer的概念,这样每个partition对应一个consumer实例,保证的其顺序性,但是不要使得consumer实例数大于partition数量/,但是它依然是有缺陷的,你想要使得整个全局消息都是有序的那么你就会面临和传统消息中间件一样使用一个partition和一个consumer实例.

...

Zookeeper分布式系统编程

使用zkCli.sh 工具模拟master-worker模式

master role:[@master role] create -e /master "master1.example.com:2223" (-e 表示ephemeral znode) backup-master:另起一个客户端[@backup-master] create -e /master "master2.example.com:2223" stat /master true (watch 观察/master节点的状态变化) 关闭第一个客户端[@master role] 在第二个客户端中[@backup-master] get /master 过一会就会出现下面的信息,说明backup-master已经收到master1已经断开的通知,收到这个信息好我们就可以创建 WATCHER:: ...

    

zookeeper-Oreilly读书笔记

zookeeper吸取了分布式锁管理和分布式数据共享的思想,它没有直接或间接的暴露lock接口和存储数据接口,然而zookeeper是专门为协同任务所设计的.同时对于异步开发这来说可以很灵活的使用它. zookeeper让分布式开发更简单,使用者可以更专心他们的处理逻辑而不是分布式的一些问题。 zookeeper使分布式所面临的各种问题变得直观,不是帮助我们避免和处理这些问题

Znode

Znode-tree是zookeeper的数据结构,其数据都存储在叶子znode上面.znode有2种model persistent/ ephemeral

To summarize, there are four options for the mode of a znode:

  • persistent 调用delete操作时才消失
  • ephemeral session端断开才消失不允许有子节点(未来可能会允许有ephemeral节点)
  • persistent_sequential
  • ephemeral_sequential.
  • ...

java性能优化笔记

调优方式:设计调优、代码调优、JVM调优、数据库调优、操作系统调优

使用有用的设计模式

  • 单例模式

减少对象实例化的次数

  • 代理模式
  • 延迟加载:加快应用启动时间,将初始化交给代理模式在第一次使用时再初始化达到延迟加载的目的。
  • 网络代理:
  • 安全代理:
  • 建议使用CGLIB或者javasisit,比jdk性能更优而且在使用时没有限制(jdk使用时需要实现一个接口)

proxy

  • 享元模式
  • 减少创建对象的次数,减小系统开心
  • 对象少了内存也少了,gc次数也就少了
  • 享元模式与对象池的不同之处在于,享元模式中的对象是不可替代的,而对象池对象是对等的一样的,可以替换

flyWeight

RabbitMQ.in.Action读书笔记

消息队列是简单的将你的应用连接到一起通过消息代理来实现相互路由。它对于你的应用就像邮政局一样.事实上它不仅仅是用于解决实时的金融问题.它还可以运用到方方面面。RabbitMQ帮助我们解决这样公共的问题,标准化应用与应用之间通讯的方式,无论是PHP还是Python还是Java/scale;和传统的mq一样RabbitMQ的消息关心的是应用之间的联系。另外RabbitMQ是使用Erlang语言编写的,这是一种专门为分布式应用而设计的语言,所以RabbitMQ集群非常简单.Erlang和java一样都运行在一个虚拟机上,在Erlang中叫node,与java不同的是node可以运行多个Erlang应用,并且这些应用在集群中的node中是透明的,可以相互访问.

RabbitMQ原理

消息结构

The labels attached to the message don’t get passed along with the payload when the message is routed.

消息载体(playload)和消息标记(label),消息标记用来路由;

channel

Once the ...