我目前正在创建一个程序,用于从用户想要的Facebook导入所有群组和供稿。 我过去常常使用带有OAuth的Graph API,这非常有用。
但我发现,我意识到一个请求无法处理1000个组和Feed的导入。
所以我正在寻找一种解决方案,可以在后台将这些数据(如cron作业)导入数据库。
要求
问题
答案 0 :(得分:2)
你可以使用neo4j。 Neo4j是一个图形数据库,可靠,快速地管理和查询高度连接的数据
1)决定节点,关系和属性的结构 您需要创建将从Facebook获取数据并将其存储在Neo4j中的API。
我在3个大项目中使用过neo4j,最适合图形数据。
2)创建一个cron jon,它将从facebook获取数据并存储到neo4j中。
我认为为图形数据库实现mysql不是一个好主意。对于大数据,neo4j是不错的选择。
答案 1 :(得分:1)
有趣的是,您已经自己设计了合适的解决方案。所以实际上你需要以下组件:
关系数据库,因为您希望以结构化,快速的方式请求数据
- >根据经验我会强调事实是有一个完全规范化的数据模型(在你的情况下有表用户,组,用户2组),也有4个字节的代理键而不是来自facebook的更大的键(对于反向引用你可以将它们的键存储为属性,但内部关系在代理键上更有效率)
- >基于哈希而不是字符串建立索引(例如crc32(lower(STRING))) - 选择的例子就是:从用户中选择一些有用的东西,其中name = SEARCHSTRING和hash = crc32(lower(SEARCHSTRING))
- >从来没有建立基于长度> 1的字符串的唯一列。 8字节;可以通过插入...选择
基于哈希+字符串检查完成独特的批量插入- >一旦你解决了这个问题,你也可以查看稀疏矩阵(参见维基百科)和位图来优化你的用户2组(但我知道这是一个额外的,不应该阻碍你很快拿出第一个版本)
定期运行的cron作业
- > Facebook最好沿着帽子给你(因此,如果他们要求你不要每秒更多地请求一次,坚持这个 - 不是更多,而是尽量尽可能接近帽子) - >如果需要解雇不同类型的请求,请花一些时间来解决此问题的管理(请求用户记录<>组记录请求,但可能会被同一上限命中)
- >大多数优化只能通过开发来完成 - 所以如果我是你,我会坚持使用任何高级编程语言,这些语言对var类型杂耍没有多大帮助,并且还伴随着对关联数组(如PHP)的广泛支持我会自己编程那个东西
- >我在将cron作业设置为具有停用输出缓冲的网页(对于php查看ob_end_flush(void))时做了很好的经验 - 易于测试并且可以通过curl触发cron作业;如果您通过自己的功能(例如,使用时间戳)传递状态输出,那么也可以灵活地运行viw浏览器或通过命令行 - >这意味着有效的测试+高效的生产运行
您的用户ui,它只会请求您的数据库,永远不会是外部系统api
大量内存,以保持高性能(最佳:所有数据+索引数据都适合数据库专用于数据库的内存/缓存)
- >如果您使用mysql作为数据库,您应该查看innodb_flush_log_at_trx_commit = 0和innodb_buffer_pool_size(如果感兴趣,只需google)
Hadoop是一个文件系统层 - 它可以帮助您提高可用性。但是我会把它放到"稀疏矩阵"的类别中,这没有什么可以阻止你提出解决方案。根据我的经验,可用性不是数据暴露项目的主要限制因素。
-------------------------- UPDATE ------------------- < / p>
我喜欢另一个答案中的neo4j。所以我想知道我能为未来的项目学到什么。我对mysql的经验是RAM通常是最大的约束。因此,增加RAM以便能够加载完整数据库可以使性能提高2-1000倍 - 具体取决于您来自何处。其他所有内容,例如索引改进和结构都是如此。因此,如果我需要编写一个性能优先级列表,它将是这样的:
我还是喜欢MYSQL。它有效地存储记录,但需要运行连接以获得关系(neo4j不需要扩展)。使用正确的索引,加入成本通常很低,根据http://docs.neo4j.org/chunked/milestone/configuration-caches.html neo4j确实需要在属性分离中添加额外的管理数据。对于大数据项目而言,这些管理数据总结并且满载到内存设置需要您购买更多内存。性能明智这两种选择都是最终的。更进一步,你会发现这一点:
在最坏的情况下,MYSQL甚至会将索引放入磁盘(至少部分),这可能导致大量读取延迟。与NEO4J相比,你可以执行一个&#39;从节点到节点的直接跳转&#39;运动,至少在理论上应该更快。