`
wanmeilingdu
  • 浏览: 24346 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分布式缓存Memcached的Java客户端优化历程

阅读更多

这是一篇比较老的文章了,对Memcached的JAVA客户端优化做了非常详细的总结。让我们认识到,要深入了解一样事物,必须深入去研究,而不能仅仅停留在使用的层面上。Memcached JAVA客户端优化过程原文如下:

Memcached 是什么?

Memcached是一种集中式Cache,支持分布式横向扩展。这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统, 但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键做分区存储,而这个区就是Memcached服务端的一个或 者多个实例,如果将客户端也囊括到Memcached中,那么可以部分概念上说是集中式的。其实回顾一下集中式的构架,无非两种情况:一是节点均衡的网状 (JBoss Tree Cache),利用JGroup的多播通信机制来同步数据;二是Master-Slaves模式(分布式文件系统),由Master来管理Slave,比 如如何选择Slave,如何迁移数据等都是由Master来完成,但是Master本身也存在单点问题。下面再总结几个它的特点来理解一下其优点和限制。

内存存储:不言而喻,速度快,但对于内存的要求高。这种情况对CPU要求很低,所以常常采用将 Memcached服务端和一些CPU高消耗内存、低消耗应用部署在一起。(我们的某个产品正好有这样的环境,我们的接口服务器有多台,它们对CPU要求 很高——原因在于WS-Security的使用,但是对于内存要求很低,因此可以用作Memcached的服务端部署机器)。

集中式缓存(Cache):避开了分布式缓存的传播问题,但是需要非单点来保证其可靠性,这个就是后面集成中所作的集群(Cluster)工作,可以将多个Memcached作为一个虚拟的集群,同时对于集群的读写和普通的Memcached的读写性能没有差别。

分布式扩展:Memcached很突出的一个优点就是采用了可分布式扩展的模式。可以将部署在一台机器上的多个 Memcached服务端或者部署在多个机器上的Memcached服务端组成一个虚拟的服务端,对于调用者来说则是完全屏蔽和透明的。这样做既提高了单 机的内存利用率,也提供了向上扩容(Scale Out)的方式。

Socket通信:这儿需要注意传输内容的大小和序列化的问题,虽然Memcached通常会被放置到内网作为 缓存,Socket传输速率应该比较高(当前支持TCP和UDP两种模式,同时根据客户端的不同可以选择使用NIO的同步或者异步调用方式),但是序列化 成本和带宽成本还是需要注意。这里也提一下序列化,对于对象序列化的性能往往让大家头痛,但是如果对于同一类的Class对象序列化传输,第一次序列化时 间比较长,后续就会优化,也就是说序列化最大的消耗不是对象序列化,而是类的序列化。如果穿过去的只是字符串,这种情况是最理想的,省去了序列化的操作, 因此在Memcached中保存的往往是较小的内容。

特殊的内存分配机制:首先要说明的是Memcached支持最大的存储对象为1M。它的内存分配比较特殊,但是 这样的分配方式其实也是基于性能考虑的,简单的分配机制可以更容易回收再分配,节省对CPU的使用。这里用一个酒窖做比来说明这种内存分配机制,首先在 Memcached启动的时候可以通过参数来设置使用的所有内存——酒窖,然后在有酒进入的时候,首先申请(通常是1M)的空间,用来建酒架,而酒架根据 这个酒瓶的大小将自己分割为多个小格子来安放酒瓶,并将同样大小范围内的酒瓶都放置在一类酒架上面。例如20厘米半径的酒瓶放置在可以容纳20-25厘米 的酒架A上,30厘米半径的酒瓶就放置在容纳25-30厘米的酒架B上。回收机制也很简单,首先新酒入库,看看酒架是否有可以回收的地方,如果有就直接使 用,如果没有则申请新的地方,如果申请不到,就采用配置的过期策略。从这个特点来看,如果要放的内容大小十分离散,同时大小比例相差梯度很明显的话,那么 可能对于空间使用来说效果不好,因为很可能在酒架A上就放了一瓶酒,但却占用掉了一个酒架的位置。

缓存机制简单:有时候很多开源项目做的面面俱到,但到最后因为过于注重一些非必要的功能而拖累了性能,这里提到 的就是Memcached的简单性。首先它没有什么同步,消息分发,两阶段提交等等,它就是一个很简单的缓存,把东西放进去,然后可以取出来,如果发现所 提供的Key没有命中,那么就很直白地告诉你,你这个Key没有任何对应的东西在缓存里,去数据库或者其他地方取;当你在外部数据源取到的时候,可以直接 将内容置入到缓存中,这样下次就可以命中了。这里介绍一下同步这些数据的两种方式:一种是在你修改了以后立刻更新缓存内容,这样就会即时生效;另一种是说 容许有失效时间,到了失效时间,自然就会将内容删除,此时再去取的时候就不会命中,然后再次将内容置入缓存,用来更新内容。后者用在一些实时性要求不高, 写入不频繁的情况。

客户端的重要性:Memcached是用C写的一个服务端,客户端没有规定,反正是Socket传输,只要语言 支持Socket通信,通过Command的简单协议就可以通信。但是客户端设计的合理十分重要,同时也给使用者提供了很大的空间去扩展和设计客户端来满 足各种场景的需要,包括容错、权重、效率、特殊的功能性需求和嵌入框架等等。

几个应用点:小对象的缓存(用户的Token、权限信息、资源信息);小的静态资源缓存;SQL结果的缓存(这部分如果用的好,性能提高会相当大,同时由于Memcached自身提供向上扩容,那么对于数据库向上扩容的老大难问题无疑是一剂好药);ESB消息缓存。

优化MemCached系统Java客户端的原因

MemCached在大型网站被应用得越来越广泛,不同语言的客户端也都在官方网站上有提供,但是Java开发者的选择并不多。由于现在的 MemCached服务端是用C写的,因此我这个C不太熟悉的人也就没有办法去优化它。当然对于它的内存分配机制等细节还是有所了解,因此在使用的时候也 会十分注意,这些文章在网络上有很多。这里我重点介绍一下对于MemCache系统的Java客户端优化的两个阶段。

第一阶段:封装Whalin

第一阶段主要是在官方推荐的Java客户端之一whalin开源实现基础上做再次封装。

  1. 缓存服务接口化:定义了IMemCache接口,在应用部分仅仅只是使用接口,为将来替换缓存服务实现提供基础。
  2. 使用配置代替代码初始化客户端:通过配置客户端和SocketIO Pool属性,直接交由CacheManager来维护Cache Client Pool的生命周期,便于单元测试。
  3. KeySet的实现:对于MemCached来说本身是不提供KeySet的方法的,在接口封装初期,同事向我提出这个需求的时候,我个 人觉得也是没有必要提供,因为缓存轮询是比较低效的,同时这类场景,往往可以去数据源获取KeySet,而不是从MemCached去获取。但是SIP的 一个场景的出现,让我不得不去实现了KeySet。
    SIP在作服务访问频率控制的时候需要记录在控制间隔期内的访问次数和流量,此时由于是集群,因此数据必须放在集中式的存储或者缓存中,数据库肯定撑不住 这样大数据量的更新频率,因此考虑使用Memcached的很出彩的操作——全局计数器 (storeCounter,getCounter,inc,dec),但是在检查计数器的时候如何去获取当前所有的计数器?我曾考虑使用DB或者文件, 但是效率有问题,同时如果放在一个字段中的话,还会存在并发问题。因此不得不实现了KeySet,在使用KeySet的时候有一个参数,类型是 Boolean,这个字段的存在是因为在Memcached中数据的删除并不是直接删除,而是标注一下,这样会导致实现keySet的时候取出可能已经删 除的数据。如果对于数据严谨性要求低,速度要求高,那么不需要再去验证Key是否真的有效,而如果要求Key必须正确存在,就需要再多一次的轮询查找。
  4. 集群的实现:Memcached作为集中式缓存,存在着集中式的致命问题:单点问题。虽然Memcached支持多Instance分布 在多台机器上,但仅仅只是解决了数据全部丢失的问题,当其中一台机器出错以后,还是会导致部分数据的丢失,一个篮子掉在地上还是会把部分的鸡蛋打破。因此 就需要实现一个备份机制,能够保证Memcached在部分失效以后,数据还能够依然使用,当然大家很多时候都用缓存不命中就去数据源获取的策略。然而在 SIP的场景中,如果部分信息找不到就去数据库查找,很容易将SIP弄垮,因此SIP对于Memcached中的数据认为是可信的,做集群也是必要的。
  5. LocalCache结合Memcached使用,提高数据获取效率:在第一次压力测试过程中,发现和原先预料的一 样,Memcached并不是完全无损失的,Memcached是通过Socket数据交互来进行通信的,因此机器的带宽,网络IO,Socket连接数 都是制约Memcached发挥其作用的障碍。Memcache的一个突出优点就是Timeout的设置,也就是可以对放进去的数据设置有效期,从而在一 定的容忍时间内对那些不敏感的数据就可以不去更新,以提高效率。根据这个思想,其实在集群中的每一个Memcached客户端也可以使用本地的缓存,来存 储获取过的数据,设置一定的失效时间,来减少对于Memcached的访问次数,提高整体性能。

因此,在每一个客户端中都内置了一个有超时机制的本地缓存(采用Lazy Timeout机制),在获取数据的时候,首先在本地查询数据是否存在,如果不存在则再向Memcache发起请求,获得数据以后,将其缓存在本地,并设置有效时间。方法定义如下:

  1. /** 
  2.   * 降低memcache的交互频繁造成的性能损失,因此采用本地cache结合memcache的方式 
  3.   * @param key 
  4.   * @param 本地缓存失效时间单位秒 
  5.   * @return 
  6. **/ 
  7. public Object get(String key,int localTTL); 

第二阶段:优化

第一阶段的封装基本上已经可以满足现有的需求,也被自己的项目和其他产品线所使用,但是不经意的一句话,让我开始了第二阶段的优化。有同事告诉我说 Memcached客户端的SocketIO代码里面有太多的Synchronized(同步),多多少少会影响性能。虽然过去看过这部分代码,但是当时 只是关注里面的Hash算法。根据同事所说的回去一看,果然有不少的同步,可能是作者当时写客户端的时候JDK版本较老的缘故造成的,现在 Concurrent包被广泛应用,因此优化并不是一件很难的事情。但是由于原有Whalin没有提供扩展的接口,因此不得不将Whalin除了 SockIO,其余全部纳入到封装过的客户端的设想,然后改造SockIO部分。

结果也就有了这个放在Google上的开源客户端:http://code.google.com/p/memcache-client-forjava/

  1. 优化Synchronized:在原有代码中SockIO的资源池被分成三个池(普通Map实现),——Free(闲)、Busy(忙) 和Dead(死锁),然后根据SockIO使用情况来维护这三个资源池。优化方式为首先简化资源池,只有一个资源池,设置一个状态池,在变更资源状态的过 程时仅仅变更资源池中的内容。然后用ConcurrentMap来替代Map,同时使用putIfAbsent方法来简化Synchronized,具体 的代码可参见Google上该软件的源文件。
  2. 原以为这次优化后,效率应该会有很大的提高,但是在初次压力测试后发现,并没有明显的提高,看来有其他地方的耗时远远大于连接池资源维 护,因此用JProfiler作了性能分析,发现了最大的一个瓶颈:Read数据部分。原有设计中读取数据是按照单字节读取,然后逐步分析,为的仅仅就是 遇到协议中的分割符可以识别。但是循环Read单字节和批量分页Read性能相差很大,因此我内置了读入缓存页(可设置大小),然后再按照协议的需求去读 取和分析数据,结果显示效率得到了很大的提高。具体的数据参见最后部分的压力测试结果。

上面两部分的工作不论是否提升了性能,但是对于客户端本身来说都是有意义的,当然提升性能给应用带来的吸引力更大。这部分细节内容可以参看代码实现部分,对于调用者来说完全没有任何功能影响,仅仅只是性能。

压力测试比较

在这个压力测试之前,其实已经做过很多次压力测试了,测试中的数据本身并没有衡量Memcached的意义,因为测试是使用我自己的机器,其中性 能、带宽、内存和网络IO都不是服务器级别的,这里仅仅是将使用原有的第三方客户端和改造后的客户端作一个比较。场景就是模拟多用户多线程在同一时间发起 缓存操作,然后记录下操作的结果。

Client版本在测试中有两个:2.0和2.2。2.0是封装调用Whalin Memcached Client 2.0.1版本的客户端实现。2.2是使用了新SockIO的无第三方依赖的客户端实现。checkAlive指的是在使用连接资源以前是否需要验证连接 资源有效(发送一次请求并接受响应),因此启用该设置对于性能来说会有不少的影响,不过建议还是使用这个检查。

单个缓存服务端实例的各种配置和操作下比较:

缓存配置 用户 操作 客户端 版本 总耗时(ms) 单线程耗时(ms) 提高处理能力百分比
checkAlive 100 1000 put simple obj
1000 get simple obj
2.0
2.2
13242565
7772767
132425
77727
+41.3%
No checkAlive 100 1000 put simple obj
1000 put simple obj
2.0
2.2
7200285
4667239
72002
46672
+35.2%
checkAlive 100 1000 put simple obj
2000 get simple obj
2.0
2.2
20385457
11494383
203854
114943
+43.6%
No checkAlive 100 1000 put simple obj
2000 get simple obj
2.0
2.2
11259185
7256594
112591
72565
+35.6%
checkAlive 100 1000 put complex obj
1000 get complex obj
2.0
2.2
15004906
9501571
150049
95015
+36.7%
No checkAlive 100 1000 put complex obj
1000 put complex obj
2.0
2.2
9022578
6775981
90225
67759
+24.9%

从上面的压力测试可以看出这么几点,首先优化SockIO提升了不少性能,其次SockIO优化的是get的性能,对于put没有太大的作用。原以为获取数据越大性能效果提升越明显,但结果并不是这样。

单个缓存实例和双缓存实例的测试比较:

缓存配置 用户 操作 客户端 版本 总耗时(ms) 单线程耗时(ms) 提高处理能力百分比
One Cache instance
checkAlive
100 1000 put simple obj
1000 get simple obj
2.0
2.2
13242565
7772767
132425
77727
+41.3%
Two Cache instance
checkAlive
100 1000 put simple obj
1000 put simple obj
2.0
2.2
13596841
7696684
135968
76966
+43.4%

结果显示,单个客户端对应多个服务端实例性能提升略高于单客户端对应单服务端实例。

缓存集群的测试比较:

缓存配置 用户 操作 客户端 版本 总耗时(ms) 单线程耗时(ms) 提高处理能力百分比
No Cluster
checkAlive
100 1000 put simple obj
1000 get simple obj
2.0
2.2
13242565
7772767
132425
77727
+41.3%
Cluster
checkAlive
100 1000 put simple obj
1000 put simple obj
2.0
2.2
25044268
8404606
250442
84046
+66.5%

这部分和SocketIO优化无关。2.0采用的是向集群中所有客户端更新成功以后才返回的策略,2.2采用了异步更新,并且是分布式客户端节点获取的方式来分散压力,因此提升效率很多。

开源代码下载

其实封装后的客户端一直在内部使用,现在作了二次优化以后,觉得应该开源出来,一是可以完善自己的客户端代码,二是也可以和更多的开发者交流使用心 得。目前我已经在Google Code上传了应用的代码、范例和说明等,有兴趣的朋友可以下载下来测试一下,与现在用的Java Memcached客户端在易用性和性能方面是否有所提高,也期待更多对于这部分开源内容的反馈,能够将它做的更好。

链接地址:http://code.google.com/p/memcache-client-forjava/

分享到:
评论

相关推荐

    MemCached Cache Java Client封装优化历程.docx

    Memcached 是一个高性能、分布式的内存对象缓存系统,主要用于减少数据库的负载,提高应用程序的性能。它通过在内存中存储数据来提供快速访问,而不是每次请求时都去查询数据库。Memcached 的设计目标是简洁、高效,...

    MemCached Cache Java Client封装优化历程

    尽管很多人认为Memcached是分布式缓存,但实际上,其服务端是单实例的。客户端在处理时会根据主键进行分区,使得数据分布在多个实例上,从而实现分布式的效果。 **集中式Cache架构** 集中式Cache有两种常见形态: ...

    于基javaee的微博平台设计--毕业设计.doc

    - **缓存策略**:利用Redis或Memcached等缓存技术,减少数据库压力,提高响应速度。 - **分布式服务**:微博平台可能会涉及多个微服务,如用户服务、内容服务、社交网络服务等,需要设计良好的API接口和服务间通信...

    基于labview的声卡数据采集系统与分析设计毕业论文

    基于labview的声卡数据采集系统与分析设计毕业论文

    Android Studio实现学生信息管理系统源码(高分项目).zip

    Android Studio实现学生信息管理系统源码(高分项目).zip个人经导师指导并认可通过的高分大作业项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 Android Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理系统源码(高分项目).zipAndroid Studio实现学生信息管理

    个人毕业设计 - 基于树莓派、OpenCV及Python语言的人脸识别.zip

    个人毕业设计 - 基于树莓派、OpenCV及Python语言的人脸识别.zip

    考虑时变压力角和时变齿侧间隙的直齿轮六自由度平移-扭转耦合非线性动力学程序,包括时域图,相图,FFT图,庞加莱图,分岔图 要想学好齿轮动力学,需要有扎实的齿轮动力学理论和非线性动振动理论 齿轮啮合

    考虑时变压力角和时变齿侧间隙的直齿轮六自由度平移-扭转耦合非线性动力学程序,包括时域图,相图,FFT图,庞加莱图,分岔图。 要想学好齿轮动力学,需要有扎实的齿轮动力学理论和非线性动振动理论。 齿轮啮合刚度建模是齿轮动力学求解的第一步。

    tdm64-gcc-10.3.0-2.exe.zip

    tdm64-gcc-10.3.0-2.exe.zip。资源来源于网络分享,如有侵权请告知!

    安卓项目源码Androidbroadcast电池电量显示源码

    安卓项目源码Android broadcast电池电量显示源码提取方式是百度网盘分享地址

    汽车中间件市场调研报告:2023年全球汽车中间件市场销售额达到了78亿美元

    汽车中间件市场调研报告:2023年全球汽车中间件市场销售额达到了78亿美元 在数字化转型的浪潮中,汽车中间件作为连接硬件与软件的关键桥梁,正引领着汽车行业的新一轮变革。随着全球汽车产业的快速发展,中间件市场规模持续扩大,展现出前所未有的增长潜力。然而,面对复杂多变的市场环境和不断涌现的新技术,企业如何精准把握市场脉搏,实现可持续发展?本文将深入探讨全球及中国汽车中间件市场的现状、趋势及竞争格局,为您揭示咨询的重要性。 市场概况: 根据QYResearch(恒州博智)的统计及预测,2023年全球汽车中间件市场销售额达到了78亿美元(约7803百万美元),预计2030年将达到156亿美元(约15630百万美元),年复合增长率(CAGR)为10.3%(2024-2030)。这一数据不仅彰显了中间件市场的强劲增长动力,也预示着未来巨大的市场空间。 技术创新与趋势: 随着自动驾驶、车联网等技术的不断发展,汽车中间件正面临着前所未有的技术挑战与机遇。新一代中间件需要具备更高的实时性、更低的延迟以及更强的数据处理能力,以满足复杂多变的汽车应用场景。同时,云计算、大数据、人工智能等技术的融合应用,将进

    毕设&课程作业_基于C#的Winform公司管理系统.zip

    计算机系毕业设计

    非常好用的黑莓文件管理器

    亲测可用与黑莓OS6和OS7的文件管理器,测试型号9788、9900、9981

    基于STM8单片机的2.4寸LCD 触摸屏触摸划线实验.zip

    基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助

    网络安全-渗透攻防知识点面试题整合

    超全知识点,用来学习都可以。

    2018平安产险数据建模大赛 驾驶行为预测驾驶风险.zip

    驾驶行为风险预测。2018平安产险数据建模大赛 驾驶行为预测驾驶风险Fork或借鉴请注明出处 @ChungKing . Thx比赛链接2018平安产险数据建模大赛 驾驶行为预测驾驶风险数据下载秩第五周 第六周 相关文章http://blog.51cto.com/yixianwei/2120336执照版权所有 (c) ChungKing。保留所有权利。根据MIT许可证授权。

    HTML5+Canvas漂亮的3D烟花2025跨年特效

    元旦烟花html

    大语言模型赋能自动化测试实践、挑战与展望(复旦大学 2024)PPT(54页).pptx

    在21世纪的科技浪潮中,人工智能(AI)无疑是最为耀眼的明星之一,它以惊人的速度改变着我们的生活、工作乃至整个社会的运行方式。而在人工智能的广阔领域中,大模型(Large Models)的崛起更是开启了智能技术的新纪元,引领着AI向更加复杂、高效、智能的方向发展。本文将深入探讨人工智能大模型的内涵、技术特点、应用领域以及对未来的影响。 一、人工智能大模型的内涵 人工智能大模型,顾名思义,是指具有庞大参数规模和数据处理能力的AI模型。这些模型通过深度学习算法,在海量数据上进行训练,能够学习到丰富的知识表示和复杂的模式识别能力。与传统的小型或中型模型相比,大模型在理解自然语言、生成高质量内容、进行跨模态信息处理等方面展现出前所未有的优势。它们不仅能够执行特定的任务,如图像识别、语音识别,还能进行创造性的工作,如文本生成、音乐创作,甚至在某些情况下展现出接近或超越人类的智能水平。 二、技术特点 海量数据与高效训练:大模型依赖于庞大的数据集进行训练,这些数据涵盖了广泛的主题和情境,使得模型能够学习到丰富的语义信息和上下文理解能力。同时,高效的训练算法和硬件加速技术,如TPU(Tensor Processing Unit)和GPU,使得大规模模型的训练成为可能。 自注意力机制与Transformer架构:许多领先的大模型采用了Transformer架构,特别是其自注意力机制,这种设计使得模型在处理序列数据时能够捕捉到长距离依赖关系,极大地提高了模型的表达能力和泛化能力。 多任务学习与迁移学习:大模型通常具备多任务学习的能力,即在一次训练中同时学习多个任务,这有助于模型学习到更通用的知识表示。此外,迁移学习使得这些模型能够轻松适应新任务,只需少量额外数据或微调即可。

    2020中国高校计算机大赛·华为云大数据挑战赛-热身赛.zip

    2020中国高校计算机大赛·华为云大数据挑战赛-热身赛队名无能万金油2020中国高校计算机大赛·华为云大数据挑战赛--热身赛热身赛Rank 7CSDN博客我的博客 (建议直接打开热身赛code.ipynb,里面有详细说明)比赛地址华为云大数据挑战赛--热身赛赛题说明热身赛题——交通流量预测随着电子信息和移动通信技术高速发展和不断融合,人工智能在各个领域都相继取得了巨大的突破,城市智能体也应运而生,而城市交通又是城市智能体的核心。交通流量数据既是城市交通中的基础数据,又是反应交通状况的重要指标之一,准确预测交通流量对城市交通具有重大意义。本题以交通流量预测为目标,邀请各个队伍以历史交通流量数据建立对应的算法模型,预测目标流量数据,通过预测值和真实值之间的对比得到预测准确率,以此来评估各队伍所提交的预测算法。要求lightgbm 2.3.0学习熊猫==0.24.2泡菜numpy全面质量管理scipy ==>1.1.0##数据在trian文件夹下:1月12日 ~2月8日 各路口数据train/01-12/chongzhi_beie

    使用Hadoop、Spark等实现的大数据平台项目.zip

    使用Hadoop、Spark等实现的大数据平台项目大数据项目集1. 基于Hadoop的离线用户行为日志分析(weblog)技术栈Hadoop豆 点击流数据处理 点击会话流模型构建 Hive明细表构建 用户行为指标分析2. 基于Akka实现RPC通信(akka_rpc)技术栈Akka 模拟Hadoop集群间通信 模拟Spark集群间通信 模拟Yarn通信3. 广告数据管理平台(dmp)技术栈Spark、Scala 广告日志ETL 报表统计 用户画像构建 广告标签统计 DMP结果入库HBase4. 基于Spark MLLib实现个性化推荐(mllib)技术栈Spark、ScalaMovieLens 数据模型构建 冷启动启动时用户随机对10部电影评分 切分数据集 ALS模型构建 模型评估 个性化推荐5. 基于Flink对CDN日志分析(flink-train)技术栈Flink、Scala 模拟Kafka生产者生成日志数据 CDN日志分析

    数据可视化大屏展示.zip

    数据可视化大屏展示维兹前言提到数据大屏,通常大家的印象就是各种图表、表格的数据展示,然后不断地轮询后端接口。对于前端开发者来说,更多的关注点在于布局问题、图表的兼容性问题以及窗口变化后图表样式问题。对于后端来说,主要考虑的是如何在不断的请求中减轻服务器的压力。但实际上,数据大屏的需求还远不止于此前端发布后应当可以作为应用直接运行,而不需要手动输入地址进行预览。 需要减轻服务器的压力,避免频繁的数据请求。 当前后端任何一方或双方都离线的情况下,数据仍能正常运行。 需要日志的存储,以便随时查看问题。 需要调用系统的能力和跨域调用API,以增加数据展示的灵活性。解决方案我采用了GO和lorca的方式来解决以上问题特征打包体积轻量,仅20MB。使用无头浏览器lorca,可自定义Chrome和JavaScript之间的交互。支持交叉编译到Windows和Mac系统。离线状态下也可以正常运行。可以运行本地服务,减轻服务器压力。编译速度快,运行性能优秀。依赖项该项目的依赖项如下Go 1.20+节点 14.8+整体方案演示下载对应的安装包

Global site tag (gtag.js) - Google Analytics