首页

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

精选文章

Context【Golang】查看全文
Context示意图.jpg
对于分布式系统的交互,除了调用时明确的参数传递之外,传入一些上下文信息是一个良好的工程实践,上下文中可以传入本次调用的一些环境信息,例如发起的IP地址,发起的请求等。

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

emptyCtx
RocketMQ查看全文
RocketMQ最早是阿里巴巴研发的类Kafka的消息队列,前身是MetaQ,后来开源,目前已经是apache旗下的顶级开源项目,RocketMQ采用Java语言进行开发,具有高性能、高可靠、高实时、分布式特点。

RocketMQ由Producer,Consumer,Broker,NameServer等四个组件构成。 Broker 存储 Broker的存储可以分为数据文件的存储和索引文件的存储。 数据文件就是消息存储文件,各个Topic的消息根据到达 Broker 的顺序写入各自的 CommitLog 文件,CommitLog文件默认为1G,文件的命名信息中包含了该存储在消息文件中的第一个全局偏移量,从而根据offset可以快速定位到消息所在的物理文件。 RocketMQ的CommitLog 文件使用顺序写,所以性能较高。 除了消息存储文件之外,每个消息队列可能会有多个消费者,每个消费者都需要消费这些事件,而且消费的速度是不同的,所以需要根据消费者记录消息的消费状况。这部分数据就是消息消费队列文件。

消费队列文件的组织方式为 /topic/queue,同一个队列中存在多个文件,ConsumeQueue 设计是每个条目使用固定长度(8字节 CommitLog 物理偏移量、4字节消息长度、8字节 Tag HashCode),这里不是存储 tag 的原始字符串,而是存储 HashCode,目的就是确保每个条目的长度固定,可以使用访问类似数组下标的方式来快速定位条目,极大的提高了 ConsumeQueue文件的读取性能,试想一下,消息消费者根据 Topic、消息消费进度(ConsumeQueue 逻辑偏移量),即第几个…
分治法查看全文
分治法顾名思义,分而治之,分治法是符合人类思维的一种朴素算法,在面对大规模问题的时候,把问题进行拆解,分成规模较小的问题,然后逐个解决,最终实现对整个问题的求解。

分治法的流程一般分为三个环节,分,治和合并。 分(Divide):通用采用递归的方式将问题分解为较小的规模,直到子问题的规模达到可以解决的时候中止拆分。 治(Conquer):递归求解。 合并(Combine):合并子问题的解构建父类问题的解。 假币问题 有n枚硬币,其中一枚假币比其他硬币相比,重量较轻,如何用一个天平找出这枚假币。 把假币按照数据等分为两份,放在天平两边,因为假币的数量较轻,所以假币位于天平较轻的一侧。这样,只需要在较轻的天平一侧继续这个过程即可。 直到最后剩下两枚硬币,就可以发现这个假币了。

代码(C++)

热门分类

算法题库

精选内容