作者文章: Fenng

社会化网络营销指南

其实这本书的正式名字是《正在爆发的营销革命》,副标题才是”社会化网络营销指南”,但是我的确不喜欢动辄”革命”的说法,对于营销是”湿”的也让人觉得有点莫名。抛开这些不谈,这本书对于有意尝试社会化网络(Social Web)中营销的市场营销团队(尤其是偏传统企业的营销团队)来说,是绝对有其参考价值的。

过去几年里,有很多营销人员对社会化网络营销是不屑一顾,财大气粗的他们”深刻”的认为在 Twitter (嗯,现在国内叫微博了)上发那些”零碎”的信息对企业来说是无足轻重的,是小打小闹的(当然也有一些公关公司把社会化营销用烂了,注意一下封腰的写推荐语的,已经接近这个典型了)。现在 Zappos、Dell 等公司在这方面的的成功案例又让很多人认识到社会化网络营销的以小博大之处。而一旦发现这方面有潜力可挖后或许又会盲目入手,眉毛胡子一把抓,有的时候效果反而会适得其反。看过几本这方面的图书之后,我的建议是参考这本书中的指导进行逐步尝试,还是相当靠谱的一件事。也建议埋头做技术的朋友们不妨看一下本书增加一点营销方面的感觉,其实技术本身也需要营销。

在社会化网络营销的过程中,也建议能够避免一些急功近利的心态,最好不要用力过猛,细水长流才会见效。如果没有耐心,还是走传统途径吧。反正你可能不缺钱。

EOF

PS. 我在这本书中学到了一句话”内容为王营销为后(“Content is king but marketing is Queen and the queen runs the household” )”。与诸君分享。

此文作者:, 位于 Review 分类 标签: , on .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.

从 Reddit 学到的经验

最近有一些比较有价值的文章似乎没引起太多人注意,比如 Steve Huffman 分享创建 Reddit 过程中的经验这篇文章,在 Twitter 上的中文技术圈子似乎没有被提及。150px-Reddit_logo.svg.png

作为社会化新闻站点,国内似乎关注 Reddit 的人并不多,我只知道少数 Geek 是其死忠粉丝。Reddit 在 2005 年 6 月由 Steve Huffman 与 Alexis Ohanian 创建,之后在 2007 年被 Condé Nast 收购。到现在看 Alexa 排名在 300 名之内。

根据维基百科的介绍(refer):Reddit 最早是用 Common Lisp 开发,随之用 Python 进行了重写(2005年底完成)。著名的Python 框架 Web.py 就是 Reddit 当时的员工 Aaron Swartz 开发的,现在 Reddit 的 Web 框架则使用了 Pylons 。在 2009 年 11 月,Reddit 迁移到 Amazon 的云计算平台。前端框架现在用的是 jQuery。或许你早就知道,Reddit 网站程序现在已经开源,如果你感兴趣的话,不妨下载研究。

严格来说,Steve 的这个演讲其实并没有涉及多深入的技术信息,只是这几条经验的确可以作为通用规则与大家分享。

  • 宕机是家常便饭(Crash Often)
    可能很多人会认为一些 Startup 的创建人都是天才,其实也未必。两个22岁的初出茅庐的大学毕业生写的程序会好到哪里?网站起步的时候,频繁的宕机让他们吃尽了苦头。其实 Twitter 以及最近热火的 FourSquare 在初期的稳定性也不怎么样,但是仍然能对用户产生足够的吸引力。这是很多创业者需要细思量之处。
  • 服务分离( Separation of Services)
    现在已经超过 20 台数据库,每个数据库只处理一种特定类型的数据,原因无他,更为简化。另外,Reddit 得到的一个经验是不要使用 Python 的线程,而是用多进程的方式。
  • 开放 Schema(Open Schema)
    个人觉得,应该叫 Key-Value 更恰当。
  • 无状态处理请求(Keep it Stateless)
    “无状态”意味着横向扩展更为容易。单节点服务器向多台扩展,或许这是第一个要考虑的问题。否则,背的包袱就会越来越重。
  • Memcached
    除了尽可能的利用 Memcached 加速用户对数据的访问速度,在 Memcached 中存储了大量预生成的页面内容,另外,也在适当的场景使用了 MemcacheDB 以满足数据持久化的需要。
  • 存储冗余数据(Store Redundant Data)
    让站点变得更慢的一个”好办法”就是遵循范式设计数据库。除了在 RDBMS 中存储数据外,在上一条提到的 MemcacheDB 中也存储了大量数据,和收益相比,冗余的成本并不高。前提是数据一致性要能得到有效保证。
  • 脱机工作(Work Offline)
    尽可能的异步处理用户操作,对计算量比较大的功能利用离线计算的模式。消息队列用用 RabbitMQ(Rabbit Technologies Ltd.已经被 SpringSource 收购) ,采用了 AMQP 协议。

或许还有意犹未尽之处,各位自己顺着文章来源分析吧。Reddit 就像一个技术标本,仔细琢磨下去还会有很多有趣的地方,相信也会对你有帮助。

EOF

剖析Force.com的多租户架构(5)- 总结

按:此为客座博文系列。投稿人吴朱华,曾在IBM中国研究院从事与云计算相关的研究,现在则致力于研发下一代云计算系统,撰写一些与云计算相关的文章,他的个人站点: PeopleYun.com。(文章版权属于原作者,转载请勿混淆。本篇原文地址)

本篇是本系列最终章,将会首先总结了Force.com的设计理念,之后会对整个系列进行总结。

设计理念

根据 Craig Weissman 的演讲和几份官方的白皮书,在Force.com的设计方面Salesforce团队主要有下面这五大考量:

  • 数据驱动:由于 Salesforce 主要面向企业用户,导致其上面运行的应用,无论是 CRM ,还是报表工具,都是以数据的CRUD(增删改查)为核心,所以 Force.com 需要由数据来驱动,而且也需要为此做一定程度的优化。
  • 规模经济:由于需要在低价格和灵活付费的基础上提供可定制化应用,所以需要让尽可能多用户共享同一套系统,来大幅减低基础设施和管理等资源的投入,并实现规模经济的效益。
  • 安全为先:由于在一套物理设备上将承载数以万计客户的企业级应用,那么如果出现严重的程序错误或者数据方面遗失或者错乱,将会发生非常严重的后果,所以安全问题是一个 Salesforce绝不能轻视的问题。
  • 定制方便:虽然各个企业都会存在一部分比较通用的流程,但是每个企业都可能存在一部分私有或者独特的流程,所以Force.com需要提供方便的定制功能来帮助用户将更快捷地将企业的业务迁移到其上。
  • 功能丰富:虽然用户能在 Force.com 上进行开发和定制,但是如果 Force.com 能提供更多的功能模块或者能让用户购买和整合第三方的应用将非常有效地帮助用户开发应用。

虽然这些设计理念说起来很容易,但是实现起来是非常艰难的。可贵地是,Salesforce 团队在开发 Force.com 的过程中基本实现了这些设计理念。

总结

关于本系列的总结,也主要包括五个方面:

  • Trade-Off 是难免的:为了满足设计目标,有时不得不做Trade-Off 。由于 Salesforce 所需要承载的多租户应用的规模之大,定制化需求之高都是前所未见的,所以Salesforce并没有采用在第二篇所提到几种常见模型,而是从长计议,采用了更灵活但技术要求更高的 Metadata 方式。 还有为了避免在数据库中执行成本非常高并会 Locking 整个数据库的 DDL(数据库定义语句)操作,所以在 Force.com 运行的时候是无法创建和修改数据库表,而这样将会提升实现的难度。
  • 优化很重要,虽然 Force.com 的多租户架构就像 Java 一样,采用了很多动态生成的机制。很显然,如果像早期的Java那样缺乏优化的话,那么 Force.com 整体的性能将会非常糟糕,从而无法实现其设计要求。但幸运的是,Salesforce 团队不仅做了优化,而且凭借着其很多核心成员来自于 Oracle 的背景,在数据库端做了很多高水平的优化,比如添加了很多貌似累赘的 Pivot 表来加快部分常用数据的读取。
  • 人才很重要:经过本系列的介绍,可以看出 Force.com 的整个架构并不全是在现有的框架和库的基础上构建的,而是为了设计目标开发了很多比较底层和比较复杂的模块,而且这些模块是只有那些顶级的程序员才能编写出来的,所以说如果没有硅谷那个庞大的优秀程序员池,Salesforce 就很难走到今天。
  • 软件是一个进化的工程:刚开始的时候 Salesforce 架构是普普通通的 B/S 架构,但是随着用户不断地提出定制化的要求,Salesforce 也不得不在架构中引入多租户的概念,之后,由于用户需要更灵活的,可伸缩的和功能更强大的平台,导致 Salesforce 不断地对其架构进行重构,到最后,终于整出了 Force.com 这一优秀的 PaaS 平台。
  • 有用的创新才珍贵:Salesforce 不仅在 Force.com 引入很多创新,而且都非常有效。在这些创新当中,最有用的除了 Metadata 驱动这种多租户架构实现机制之外,还有一个名为”回收站(Recycle Bin)”的概念,这个回收站主要存储30天来那些从数据表里面删除的数据,如果用户在30天内发现数据是误删,可以对数据进行恢复,这样既减低数据误删的可能性,而且能回收部分物理资源,比如硬盘空间等。

最后,我想说虽然到现在为止,Salesforce 还不能算是一场巨大的商业胜利,但是它在产品和思路方面有很多值得我们借鉴的地方,这也是我写本文的初衷,并谢谢大家花时间在这个系列上面,希望能对得起大家的时间。还有,如果大家对本系列有什么疑问或者见解,那么就不要吝惜你的时间,请留下你的评论。

本系列参考资料


本系列文章列表

EOF

剖析Force.com的多租户架构(4)- Force.com的多租户架构(下)

按:此为客座博文系列。投稿人吴朱华,曾在IBM中国研究院从事与云计算相关的研究,现在则致力于研发下一代云计算系统,撰写一些与云计算相关的文章,他的个人站点: PeopleYun.com。(文章版权属于原作者,转载请勿混淆。本篇原文地址)

本篇是上篇的延续,主要是通过对上篇提到的几个模块进行深入地分析。

大规模数据处理引擎

由于Force.com需要处理的数据量不论是来自网页端,还是来自Web Service端都是非常巨大的,所以Salesforce在Force.com中引入了特制的大规模数据处理引擎来处理大量的数据读写和在线事务。它主要有两大特点:其一是对大规模数据处理进行了优化,特别是当一个API调用发来很多待处理的数据时,这个引擎能非常快速地处理。其二是这个引擎内置错误恢复机制,当处理大规模数据时候,假如其中一个步骤发生错误时,这个引擎会捕捉和修复这个错误,并且保持这个步骤之前正确的结果以避免整个重做。

多租户感知的查询优化引擎

大多数现在数据库都自带基于成本的查询优化器,这种优化器主要是基于数据库表和索引数据等相关数值来进行计算和比较。但是由于传统的基于成本的优化器都是主要为单租户的环境设计的,所以他们并不能很好地适应多租户的环境,因为在数据库中是没有多租户这个概念。为了让优化器能够在多租户环境下良好工作,Salesforce在Oracle自带优化器的基础上搭建了一个多租户感知的查询优化引擎,它也主要有两个特点:其一是这个引擎为每个多租户对象维护了一整套便于优化的数据(租户层的,组层的和用户层的)。其二是这个引擎也维护租户和租户下面用户的安全信息,这样不仅能提升了效率,因为能避免将那些不属于这个租户的数据加入到计算,而且能提升数据的安全性。

全文检索引擎

全文检索功能对Web应用而言,基本可以算是一种基本功能,而对基于Force.com的应用而言,同样如此,Force.com为此内置一个全文检索引擎,其是基于大名鼎鼎的Lucene技术。当一个运行在Force.com平台上的应用对数据库中数据进行更新的时候,会有一组称为检索服务器的后台进程来异步更新数据相关的索引。通过这种异步机制不仅能够保证检索工作不影响处理事务的效率,而且同时也能让用户使用到最新的搜索结果。为了优化这个检索流程,系统会同步将修改过的数据复制到一个内部”等待检索”的表,之后检索服务器会访问这个表来进行检索,这样好处是减少了检索服务器的I/O处理量。而且为了更好地适应多租户环境,检索引擎自动为每个租户维护一个独立的索引。

数据库表的设计

下图为Force.com的数据库表结构:

Force DB.PNG

图1. 数据库表的结构(图源自参[4])

Metadata表

Metadata表的作用是存储用户定制的对象和对象所包含的字段的结构信息,不保存具体的数据,主要有两大类:

  • Object Metadata表:这个表主要存储对象的信息,其中主要字段包括对象的ID(ObjID),拥有这个对象的租户的ID(OrgID)和这个对象的名字(ObjName)。
  • Field Metadata表:这个表主要存储对象附带字段的信息,其中主要字段包括字段的ID(FieldID),拥有这个字段的租户的ID(OrgID),这个字段的名字(FieldName),这个字段的数据类型(datatype)和一个布尔字段(IsIndexed)来定义这个字段是否需要被检索。

Data表

Data表的作用和Metadata表正好相反,它主要存储那些用户定制的对象和对象所包含的字段的数据,主要也包括两大类:

  • Data表:这个表放置着上面那些对象和字段所对应的数据,核心字段有全局唯一的ID(GUID),租户ID(OrgID),对象的ID(ObjID)和存放对象名字的”Nature Name(自然名称)”,比如这行和一个会计对象有关,这行的””Nature Name”字段可能是”Account Name”,除了这些核心字段之外,这个表还有名字从Value0到Value500的501个数据列来存储数据,而且这些列都是varchar的形式来承载不同类型的数据,这种数据列也被称为”flex列”。
  • Clob表:这个表主要存放那些CLOB(Character Large Object,字符大对象)数据,对象最大支持到32000个字符。

Pivot表

Pivot表,也称为”数据透视表”,在Force.com中是以denormalized (去规范化)格式存储那些用于特殊目的的数据,比如用于检索(indexing),唯一性和关系等,主要作用是加速这些特殊数据的读取以提升系统整体的性能。主要有五种Pivot表:

  • Index Pivot表:由于Data表里面数据都是以”flex列”的形式存储,所以很难在Data表的基础上对表中的数据进行检索,所以Force.com引入Index Pivot表来解决这个问题,系统在运行的时候会将需要索引的数据从Data表同步到Index Pivot表中相对应的字段来方便检索,比如这个数据的类型是日期型的,那么它将会被同步到Index Pivot表中的日期字段。
  • UniqueFields Pivot表:这个表是用来帮助系统在Data表中字段实现唯一性。
  • Relationships Pivot表:Force.com提供了”Relationship”这个数据类型来定义多个对象之间的关系,而Relationships Pivot表则起到方便和加速”Relationship”数据读取的作用。
  • NameDenorm表:是一个简单的数据表用于存储对象的ID(ObjID)和这个对象的实例的名字,主要让一些仅需获取名字的查询调用,从而让一些简单的查询无需查询规模庞大的Data表。
  • FallbackIndex表:这个表将记录所有对象的名字,来免去成本高昂的”UNION”操作,从而加速查询。

APEX

APEX的语言是为Force.com度身定做的一门语法上类似Java的强类型面向对象语言,主要可以通过APEX在Force.com上创建Web Service,编辑复杂的商业逻辑和整合多个Force.com的模块等。APEX主要以两种方式执行:其一是以单独脚本的形式,按照用户的需要执行。其二是以触发器的形式,当一个特定的数据处理事件发生的之前或者之后,与这个事件绑定的APEX代码将会被执行。而且所有APEX代码将会以Metadata的形式存储在Metadata表内。当一段APEX代码被调用的时候,APEX的翻译器(runtime interpreter)将会从Metadata Cache读取编译之后的APEX代码,而且能够同时被多个租户共享以提升效率。

那么为什么要在Force.com引入APEX这门新的语言,而不是像Google App Engine那样支持已经有一定市场占有率的语言,比如Java和Pyhon。Salesforce的首席架构师在谈到这点时,他提出了一个非常重要的原因,那就是安全,首先,Salesforce会APEX语言度身设计一组管理工具,通过这个工具能够非常方便地监控APEX脚本的执行,并且能知道这个脚本在执行过程所耗费的CPU时间,内存容量和SQL语句的数量等数据来判断是否需要中断这个APEX脚本,以避免影响到属于其他租户的应用,如果中断的话,系统会抛出一个runtime exception给上层的调用者。其次,基于APEX语言的代码能够对其内嵌的SOQL(Sforce Object Query Language)和SOSL(Sforce Object Search Language)进行验证来避免实际运行时出现错误。还有,在安全方面除了APEX自带的功能之外,Salesforce还要求每个上传到Force.com的APEX脚本,都需要自带能覆盖其75%代码的测试用例,这种做法不仅显著地提升APEX代码的质量从而确保平台整体运行的稳定,而且在Force.com自己更新的时候,能使用这些用例来确保新的更新不会影响现有的基于Force.com的应用。

关于Force.com多租户架构的详细介绍已经告一段落,下篇会对本系列所提到的内容进行总结!


本系列文章列表

EOF