粗粒度和细粒度有什么区别?
我在 Google 上搜索了这些术语,但找不到它们的含义。
来自维基百科(粒度):
粒度是系统被分解成小部分的程度,无论是系统本身还是它的描述或观察。它是一个更大的实体被细分的程度。例如,以英寸为单位的码比以英尺为单位的码具有更细的粒度。
与细粒度系统相比,粗粒度系统由更少、更大的组件组成;系统的粗粒度描述涉及大型子组件,而细粒度描述则涉及由较大组件组成的较小组件。
简单来说
最好有更多粗粒度的服务操作,由细粒度的操作组成
粗粒度:一些对象包含大量相关数据,这就是服务具有更广泛功能范围的原因。示例:单个“帐户”对象包含客户姓名、地址、帐户余额、开户日期、最后更改日期等。 因此:增加设计复杂性,减少各种操作的单元数
细粒度:更多的对象每个都持有更少的数据,这就是服务的功能范围更窄的原因。示例:Account 对象保存余额,Customer 对象保存姓名和地址,AccountOpenings 对象保存开户日期等。 因此:降低设计复杂性,增加各种服务操作的单元数。这些是在这些对象之间定义的关系。
另一种理解方法是考虑进程和线程之间的通信。进程在粗粒度通信机制的帮助下进行通信,如套接字、信号处理程序、共享内存、信号量和文件。另一方面,线程可以访问属于进程的共享内存空间,这允许它们应用更细粒度的通信机制。
资料来源:Java 并发实践
在服务方面:
http://en.wikipedia.org/wiki/Service_Granularity_Principle
根据定义,粗粒度服务操作比细粒度服务具有更广泛的范围,尽管这些术语是相对的。前者通常需要增加设计复杂性,但可以减少完成任务所需的调用次数。
细粒度的服务接口与聊天接口大致相同。
就文本文件这样的数据集而言,粗粒度意味着我们可以转换整个数据集,但不能转换数据集上的单个元素,而细粒度意味着我们可以转换数据集上的单个元素。
粗粒度和细粒度都考虑优化一些服务。但区别在于水平。我喜欢用一个例子来解释,你会很容易理解的。
细粒度:比如我有100个服务,比如findbyId、findbyCategry、findbyName……等等。为什么我们不能提供 find(id, category, name....等等) 而不是那么多服务。所以这样我们可以减少服务。这只是一个例子,但目标是如何优化服务的数量。
粗粒度:例如,我有 100 个客户端,每个客户端都有自己的 100 个服务集。所以我必须提供 100*100 的总服务。这是非常困难的。我所做的不是那样,而是将适用于大多数客户端的所有常见服务标识为一个服务集并单独保留。例如,在 100 个服务中,50 个服务是常见的。所以我只需要管理 100*50 + 50。
粗粒度的粒度并不总是意味着更大的组件,如果你按照粗的字面意思去理解,它意味着粗糙或不合适。例如,在软件项目管理中,如果您将一个小系统分解为几个组件,这些组件大小相等,但复杂性和功能各不相同,这可能会导致粗粒度。相反,对于细粒度的细分,您可以根据每个组件提供的功能的内聚性来划分组件。
粗粒度和细粒度。这两种模式都定义了多个 Spark 任务之间如何共享核心。顾名思义,细粒度模式负责在更细粒度的级别上共享内核。细粒度模式已被 Spark 弃用,很快将被删除。
与细粒度服务相比,Corse 粒度服务提供了更广泛的功能。根据业务领域,可以创建单个服务来服务单个业务单元,或者如果子单元在很大程度上相互独立,则可以创建专门的多个细粒度服务。粗粒度服务可能会变得更加困难,可能由于其大小而不太适应变化,而细粒度服务可能会引入管理多个服务的额外复杂性。
在存储空间非常重要的大规模数据时,粒度具有重要的应用。
根据牛津词典,粒度的含义是——
“一组数据的规模或详细程度。”
根据剑桥词典——
“信息中包含很多小细节,让你可以非常清楚地了解正在发生的事情”
所以从这个词的具体含义来看,它是一种连续过程的数据分区。
更细的粒度由小区间划分组成,从而可以实现详细的表示。另一方面,粒度越粗,帧间隔越大,这样可以节省存储空间。
两种粒度的使用是特定于应用程序的。
例如-如果我们有一个应用程序,其中最近的时间信息比旧的信息更重要。对于最近数据的详细表示,可以通过更细的粒度找到,而对于较旧的数据表示,我们可以使用更粗的粒度。