首页

来自智得网
跳转至: 导航、​ 搜索

精选文章

Kafka查看全文
Kafka体系图.png
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。

kafka是apache旗下一款著名的消息队列。其最早由LinkedIn公司采用Scala语言开发,支持多分区,多副本,kafka以高吞吐,可水平扩展,支持流式数据处理等多种特性而被广泛使用。 kafka的体系概念有几个重要的术语。 Producer,生产者,也就是消息的发送方。 Consumer,消费者,连接kafka集群,接受消息,并进行业务逻辑处理。 Broker,服务节点,可以看作一个kafka实例。 Topic,是一个逻辑概念,Producer和Consumer都会关联特定的主题进行发送和消费。一个Topic还可以分为若干个分区,称为Partition,每个Partition对应不同的物理存储和日志文件。 存储设计 kafka的因为顺序写的特点,所以存储使用日志。每个分区副本下的日志文件会分为多个分段,LogSegment,每个LogSegment有一个日志文件和两个索引文件构成,两个索引文件分别是对偏移量和时间戳的索引。 延迟消息 kafka存在大量的延时操作,例如延时生产,延时消费,延时拉取等,kafka基于时间轮的概念实现此类需求。 时间轮是一个存储定时任务的环形队列,队列中每一项代表了该时间范围内需要触发的任务。

时间轮是可以复用的,因为定时任务可能延时较久,所以时间轮有多个级别。比如最小粒度的时间轮间隔时间为1ms,时间轮的格子为20个,则该时间轮可以表示的时间跨度为20ms,那么其上级时间轮的每个格子代表的时间跨度就是20ms…
内存屏障查看全文
程序执行的顺序和代码的顺序不一定是一致的,因为程序编译期间的优化、cache访问的优化以及多核等因素都会导致CPU指令乱序执行,这些乱序可能会导致程序的运行结果不符合预期。

内存屏障会设置同步点,即使在多核的情况下也可以保障屏障前后的内存访问的一致性。 编译屏障 编译屏障告诉编译器不要对当前代码进行过度的优化,保证生成的汇编代码的指令顺序尽量和编程语言的代码顺序保持一致。编译屏障对CPU执行时产生的重排序没有任何作用。 写内存屏障 写内存屏障可以起到两个作用: 指令重排的限制,写内存屏障之前的写操作将在屏障后的写操作之前发生。 写内存屏障之后的写入指令之前,会清空当前CPU存储缓冲中的所有写操作,将这些数据全部写入到主存中。这样的话系统中的其它的CPU,其他的线程就可以看到写内存屏障之后的写入数据之前先看到写内存屏障之前的写入数据。 读内存屏障 写内存屏障可以起到两个作用: 指令重排的限制,读内存屏障之前的读操作将在屏障后的读操作之前发生。 在执行读内存屏障之后的读取指令之前,一定要保证处理完当前CPU的无效队列。这样的话,当前CPU的缓存状态将完全遵照MESI协议,可以保证缓存数据一致性。 读写内存屏障 读写内存屏障可以起到两个作用: 通用内存屏障也会对处理器指令重排做出一些限制,也就是在通用内存屏障之前的写入和读取指令一定不会被重排序到通用内存屏障之后的写入和读取指令之后。

其次,在执行通用内存屏障之后的任何写入和读取取指令之前,一定要保证清空当前CPU存储缓冲中的所有写操作,并且还要处理完当前CPU的无效队列。
Context【Golang】查看全文
Context示意图.jpg
对于分布式系统的交互,除了调用时明确的参数传递之外,传入一些上下文信息是一个良好的工程实践,上下文中可以传入本次调用的一些环境信息,例如发起的IP地址,发起的请求等。

因为分布式系统调用的拓扑关系一般是一个有向无环图,所以上下文也同样存在层级关系或者父子关系,下游的上下文带有上游上下文传入的所有信息,还可以加入自己的信息。 由于存在父子关系,所以上下文除了信息传递之外还可以进行一些控制信息的传递,例如传递超时,取消信息,一旦一个节点的上下文触发了取消,取消信息可以传播给其所有的子孙节点。 Golang的context就是上述上下文的一种实现,Golang的协程之间存在各种较为复杂的关系,比如一个通道的关闭可能会触发多个协程的关闭,还有微服务场景下更为复杂的级联关系,比如http执行过程会可能会启用一个新的协程发起rpc调用,如何优雅的管理这些协程的退出,例如在请求已经超时的情况,把整个调用链的协程全部关闭,Context就可以承担这个功能。 context是golang中定义的一个接口context包中提供了context接口的一些实现类,例如emptyCtx,valueCtx,cancelCtx,timerCtx等。

emptyCtx

热门分类

算法题库

精选内容