实际上,定义Topology实例的时候,我们定义好Spout实例和Bolt实例,然后将Topology实例提交给Nimbus的时候,这些定义好的Spout实例和Bolt实例会被“序列化”,“序列化”得到的字节码文件由Nimbus保存在Master Node上的某处,运行在Worker Node上的thread可以复制这些序列化后得到的字节码文件,从中“反序列化”得到Spout实例和Bolt实例。
具体来说就是:在定义Topology实例的时候,定义好的Spout实例和Bolt实例并不是最终的具体实例,而只是作为最终具体实例的数据来源,为了更好理解,我们可以称之为Spout原型实例和Bolt原型实例,这些原型实例被序列化保存在字节码文件中。在提交Topology实例后,在Worker Node上运行的process中的thread会复制该字节码文件,反序列化Spout原型实例和Bolt原型实例,得到最终的具体实例。在同一个thread中的多个task共享该具体实例,由于同一个thread上的多个task串行执行,因而不会出现“由于共享该具体实例而导致并发问题”的情形。关于这点,可见文章《Storm中进程,线程,任务和实例的关系》
因而,以上所说的前2种情况不成立,第3种情况论述不够准确,只有同一个thread内的多个task才共享同一个spout实例或者bolt实例,不同thread内的task不共享同一个spout实例或者bolt实例。
[3]https://groups.google.com/forum/#!topic/storm-user/IS8PijLjU8c
[4]https://groups.google.com/forum/#!topic/storm-user/com4JfU9aJ4