昨天分享过一篇文章《AzureDirectory Library for Lucene.Net》,关于Azure下的全文检索解决方案。补充说明一些内容:
原来对“AzureDirectory Library for Lucene.Net”确实有欠了解,在有了一次教训后,现在有了更深入了解(但还是经验主义,没有足够严谨去看看源码,欢迎斧正)。这个的本质并非是把Azure Store当虚拟磁盘用,开始我还真是这么理解的,所以我被它坑了!其实它是本地建个缓存目录,在检索或建索引的时候把索引文件先从Azure Storage同步到缓存目录,然后每次建索引indexwriter dispose的时候把内容同步过去,如果索引文件大,这就对缓存目录大小要求极高!如果你用内存当缓存目录,那你就要足够大的内存。
如果是用Azure的WebSite,共享模式,给你的磁盘空间是1G,再加上一些程序文件,它会把索引文件缓存到你的临时目录,一会就满了,会导致你网站不正常,升级到保留模式后,选择最小的实例,空间会到10G,基本够用。
如果用它的话,建议用WebRole,相对磁盘空间大一些,特小实例(其实价格和WebSite的共享模式是一样的)有20G空间,加上几个G的系统文件,还能有十几个G。另外如果用WebRole或WorkRole,AzureDirectory对应的缓存目录最好设置在Local Resource(本地资源)下的Local Storage(本地存储),并且给它配置足够大的空间,这样你就不担心报磁盘空间不足的错误。为什么要用Local Storage而不是Web Role/Worker Role的C盘D盘呢?主要两个问题:一个是默认对C盘和D盘下目录没有写入权限,每次虚机回收后,需要远程桌面登录上去配置权限或写启动脚本去做这事;另外用Local Storage你才好方便的配置空间大小的,其他目录似乎超出一定范围就会报空间不足的错误(这个待确认,没有找到资料,从异常信息来看,到一定大小后会有磁盘空间不足的异常,包括Local Storage的空间如果没有指定具体大小,设置为默认,也会到一定大小后报磁盘空间不足的异常)。
我现在索引文件大小应该在10G左右,所以我选了一个小实例的Web Role,用来缓存索引文件的Local Storage给它配了100G的空间,相信足够用很长一段时间了。并且我把建索引的工作也放到Web Role来做了,一者少开一个Worker Role省钱,二者建索引和读索引的缓存目录可以共用,读索引就不必频繁去从Storage同步索引文件回到本地。但要注意建索引会占用较高CPU,所以如果放在WebRole里面去建索引,每次应该建少量索引,不要一次太多。
总的来说,Azure还是非常好的东西,但是很多开发模式和架构思想已经和原来都不一样了,如果用老的思路去设计基于Azure的系统,会走不少弯路,希望大家多多分享交流。
搜索效果演示:http://www.openlab.co/search?q=%E8%A5%BF%E5%B7%A5%E5%A4%A7+and+%E5%AE%9D%E7%8E%89